【问题标题】:how do you get your current screen in kivymd?您如何在 kivymd 中获取当前屏幕?
【发布时间】:2021-06-04 22:26:19
【问题描述】:

所以我的主应用程序类看起来像这样

class MainApp(MDApp):
    def on_resize(self):
        if self.app.manager.get_screen() == "table_screen":   
            if self.width>self.height:
                self.manager.get_screen("table_screen").ids.table_image.source="table1.png"
                self.manager.get_screen("table_screen").ids.left_panel.opacity=0
            else:
                self.ids.left_panel.size_hint_x=.5
                self.ids.left_panel.opacity=1
    def build(self):
        Window.bind(size=self.on_resize())
        return Main()

我想首先知道当前屏幕是“table_screen”,然后我需要从该屏幕获取 id,但是使用当前代码我得到一个错误

 if self.root.manager.get_screen() == "table_screen":
 AttributeError: 'NoneType' object has no attribute 'manager

那么有什么办法呢? 这是我的主要内容

class Main(MDBoxLayout):
    pass

这是我在 kv 中的主要内容

<Main>:
    orientation: "vertical"
    id: main
    ScreenManager:
        id:SM

【问题讨论】:

  • 您的Main 课程是什么?是ScreenManager吗?
  • 另外,请注意Window.bind(size=self.on_resize()) 不正确。它应该是Window.bind(size=self.on_resize),没有额外的()
  • 添加了我的主课

标签: python kivy kivymd


【解决方案1】:

首先,改变

Window.bind(size=self.on_resize())

Window.bind(size=self.on_resize)

由于App 的根类包含ScreenManager,您可以将on_resize() 重写为:

def on_resize(self, *args):
    if self.root.ids.SM.current == "table_screen":   
        if self.width>self.height:
            self.root.ids.SM.current_screen.ids.table_image.source="table1.png"
            self.root.ids.SM.current_screen.ids.left_panel.opacity=0
        else:
            self.ids.left_panel.size_hint_x=.5
            self.ids.left_panel.opacity=1

ScreenManagercurrent 属性包含当前屏幕的名称,current_screen 属性包含对当前Screen 对象的引用。由于您尚未发布 MCVE,我无法确定您对 ids 的使用是否正确。

【讨论】:

  • 这确实解决了第一个问题,但现在我得到一个 TypeError: on_resize() 接受 1 个位置参数但给出了 3 个错误,这个错误的根源是什么?
  • def on_resize(self, *args):记下我编辑的答案。
猜你喜欢
  • 1970-01-01
  • 2011-04-09
  • 2010-12-28
  • 2021-06-24
  • 2017-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多