亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將我的自定義小部件連接到我的屏幕管理器

將我的自定義小部件連接到我的屏幕管理器

弒天下 2022-03-09 20:23:54
我正在嘗試使用 Python 和 kivy 構建一個應用程序。在我的 kv 文件中,我想創建一個可以被其他屏幕引用的自定義小部件 (MenuFloatLayout)。它基本上是每個屏幕上的菜單欄。此欄由幾個切換按鈕組成,如果您當前在此按鈕鏈接到的屏幕上,這些按鈕處于向下狀態并禁用。這被引用: state: "down" if root.manager.current == 'Screenname' else "normal"問題是:root.manager.current 不再鏈接到通常的屏幕管理器,因為我的自定義小部件現在是根。有解決辦法嗎?或者是否有更簡單的方法將切換按鈕狀態鏈接到用戶所在的屏幕?我是編程和 Python 的新手,很高興您能給我任何幫助或提示!謝謝!Python文件:from kivy.app import Appfrom kivy.lang import Builderfrom kivy.uix.screenmanager import Screen, ScreenManagerclass StartWindow(Screen):    passclass PortfolioOverview(Screen):    passclass Portfolio(Screen):    passclass Market(Screen):    passclass Economics(Screen):    passclass PortfolioTools(Screen):    passclass WindowManager(ScreenManager):    passkv = Builder.load_file("vigiles.kv")class VigilesApp(App):    def build(self):        return kvif __name__ == "__main__":    VigilesApp().run()目標是將我的自定義小部件鏈接回我的屏幕管理器,或者找到更簡單的解決方案將切換按鈕狀態鏈接到當前屏幕。AttributeError:“MenuFloatLayout”對象沒有屬性“manager”
查看完整描述

2 回答

?
holdtom

TA貢獻1805條經驗 獲得超10個贊

我會將您的根小部件設為布局小部件(GridLayout、、BoxLayout或FloatLayout),并讓您的屏幕管理器僅占用實際屏幕的一部分。嘗試改變


WindowManager:

    StartWindow:

    PortfolioOverview:

    Portfolio:

到:


GridLayout:

    # Play with using a FloatLayout or BoxLayout instead of GridLayout if you want

    cols: 1

    MenuFloatLayout:

        id: the_menu_id

    WindowManager:

        StartWindow:

        PortfolioOverview:

        Portfolio:

這樣,您的菜單將持續存在,并且屏幕管理器僅更改實際屏幕的一部分。


通過給出MenuFloatLayoutanid您可以引用它。要從 Python 端self.root.ids.the_menu_id引用它,請在從App對象引用它時使用。如果您在其他類型的對象中,您可以通過首先導入App( import App) 然后使用App.get_running_app().root.ids.the_menu_id


要從屏幕上引用它,您可以使用app關鍵字。例如:app.root.ids.the_menu_id


引用菜單的所有三種方式id基本相同。


查看完整回答
反對 回復 2022-03-09
?
翻過高山走不出你

TA貢獻1875條經驗 獲得超3個贊

問題

  • 實例太多MenuFloatLayout

  • 使用大量資源,例如內存,這會使應用程序變大且性能不佳

解決方案

  • 創建一個實例MenuFloatLayout

  • 每個屏幕引用的唯一一個實例MenuFloatLayout

  • 使用嵌套ScreenManager. 這首先ScreenManager用于控制身份驗證/登錄屏幕。第二個ScreenManager用于不同屏幕之間的導航。

  • 創建一個動態類ToggleButton

例子

main.py

from kivy.app import App

from kivy.lang import Builder

from kivy.uix.screenmanager import Screen, ScreenManager



class StartWindow(Screen):

    pass



class PortfolioOverview(Screen):

    pass



class Portfolio(Screen):

    pass



class Market(Screen):

    pass



class Economics(Screen):

    pass



class PortfolioTools(Screen):

    pass



class WindowManager(ScreenManager):

    pass



Builder.load_file("main.kv")



class TestApp(App):

    def build(self):

        return WindowManager()



if __name__ == "__main__":

    TestApp().run()

main.kv - kv 文件

<WindowManager>:

    sm2: sm2

    StartWindow:

    Screen:

        name: 'connect'


        ScreenManager:

            id: sm2

            PortfolioOverview:

            Portfolio:

            Market:

            Economics:

            PortfolioTools:


        MenuFloatLayout:



<CustomToggleButton@ToggleButton>:    # dynamic class

    group: "pmenu"

    state: "normal" if app.root is None else "down" if app.root.sm2.current == self.text.lower() else "normal"


    background_disabled_down: "atlas://data/images/defaulttheme/button_pressed"

    disabled_color: 1, 1, 1, 1


    on_state:

        if self.state == "down": self.disabled = True

        else: self.disabled = False


    on_release:

        app.root.sm2.current = self.text.lower()



<MenuFloatLayout@FloatLayout>:    # dynamic class

    Label:

        text: "Portfolio"

        markup: True

        size_hint: 0.5, None

        height: 30

        pos_hint:{"top":1, "left":1}


    TextInput:

        hint_text: "Search"

        multiline: False

        size_hint: 0.5, None

        height: 30

        pos_hint:{"top":1, "right":1}


    ScrollView:

        size_hint: None, None

        do_scroll_y: False

        do_scroll_x: True

        size: 500, 150


        GridLayout:

            rows: 1

            size_hint_y: None


            CustomToggleButton:

                text: 'Overview'

                state: 'down'   # default


            CustomToggleButton:

                text: 'Portfolio'


            CustomToggleButton:

                text: 'Market'


            CustomToggleButton:

                text: 'Economics'


            CustomToggleButton:

                text: 'Tools'



<StartWindow>:

    name: "start"

    BoxLayout:

        canvas:

            Rectangle:

                size: self.size

        color: 1, 1, 1, 0

        id: login_layout

        orientation: 'vertical'

        padding: [10,10,10,10]

        spacing: 30


        Label:

            text: 'some text'

            font_size: 32

            color: 0, 0, 0, 1


        BoxLayout:

            orientation: 'vertical'


            Label:

                text: 'Login'

                font_size: 18

                halign: 'left'

                text_size: root.width-20, 20

                color: 0, 0, 0, 1


            TextInput:

                id: login

                multiline:False

                font_size: 28


        BoxLayout:

            orientation: 'vertical'

            Label:

                text: 'Password'

                halign: 'left'

                font_size: 18

                text_size: root.width-20, 20

                color: 0, 0, 0, 1


            TextInput:

                id: password

                multiline:False

                password:True

                font_size: 28


        Button:

            text: 'Connect'

            font_size: 24

            on_release:

                root.manager.current = 'connect'




<PortfolioOverview>:

    name: "overview"

    Label:

        text: 'Screen - Overview'


<Portfolio>:

    name: "portfolio"

    Label:

        text: 'Screen - Portfolio'


<Market>:

    name: "market"

    Label:

        text: 'Screen - Market'


<Economics>:

    name: "economics"

    Label:

        text: 'Screen - Economics'


<PortfolioTools>:

    name: "tools"

    Label:

        text: 'Screen - Portfolio Tools'

輸出

http://img1.sycdn.imooc.com//62289ca60001b04707980581.jpg

查看完整回答
反對 回復 2022-03-09
  • 2 回答
  • 0 關注
  • 177 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號