为了账号安全,请及时绑定邮箱和手机立即绑定

将我的自定义小部件连接到我的屏幕管理器

将我的自定义小部件连接到我的屏幕管理器

弑天下 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'

输出

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

查看完整回答
反对 回复 2022-03-09
  • 2 回答
  • 0 关注
  • 156 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信