我的GUI包括一个标题栏,其中一个按钮控制一个屏幕管理器,然后是实际的屏幕管理器,还有一个底部的栏,状态更新。
通常我控制中间的屏幕和顶部的按钮。很简单。现在我的问题是,其中一个屏幕已经非常复杂了,我有一个问题,我有太多的缩进。所以,我们来看看:--我希望在另一个屏幕管理器sm1中有一个屏幕管理器sm2,从sm2中从sm1访问屏幕。
我试图用下面的语法重新创建我的问题,我希望我没有忘记任何重要的东西。我试着玩动态类之类的,但是我的代码被链接到了很多用root.functions访问的python代码,但是它没有很好的工作。
Kivy语法:
BoxLayout:
size_hint: 1, 0.1
Label:
text: 'Title Bar with Menu'
Button:
text: 'Go to Screen 1'
on_release: sm1.current = 'outerScreen1'
Button:
text: 'Go to Screen 2'
on_release: sm2.current = 'outerScreen2'
Screenmanager:
id: sm1
Screen:
name: 'outerScreen1'
BoxLayout:
Label:
text: 'Testlabel'
Screen:
name: 'outerScreen2'
BoxLayout:
orientation: 'horizontal'
size_hint: 1, 0.1
anchor_y: 'top'
pos_hint: {'top': 1}
Label:
text: 'Title Bar inside outerScreen2'
Button:
text: 'Go to innerscreen Home'
on_release: sm2.current = 'screen2Home'
Button:
text: 'Go to innerscreen Meow'
on_release: sm2.current = 'screen2Meow'
Button:
text: 'Go to outerscreen 1, but inside screenmanager sm2'
on_release: sm2.current = 'outerScreen1' **#This is where the problem is**
BoxLayout:
orientation: 'horizontal'
size_hint: 1, 0.9
ScreenManager:
id: sm2
Screen:
name: 'screen2Home'
Label:
text: 'simple test'
Screen:
name: 'screen2Meow'
Label:
text: 'I meow sometimes'发布于 2020-03-11 13:58:38
你可以做你想做的事,但它需要一个丑陋的黑客。为了设置ScreenManager的当前ScreenManager,Screen必须是ScreenManager的子级。但是任何Widget (包括Screens)都只能有一个父级。因此,丑陋的攻击是根据需要在Screen之间移动ScreenManagers。
修改后的kv版本的一部分实现了hack的一部分:
ScreenManager:
id: sm1
Screen:
id: outer_screen_1 # added id
name: 'outerScreen1'
BoxLayout:
Label:
text: 'Testlabel'
Screen:
name: 'outerScreen2'
BoxLayout:
orientation: 'horizontal'
size_hint: 1, 0.1
anchor_y: 'top'
pos_hint: {'top': 1}
Label:
text: 'Title Bar inside outerScreen2'
Button:
text: 'Go to innerscreen Home'
on_release: sm2.current = 'screen2Home'
Button:
text: 'Go to innerscreen Meow'
on_release: sm2.current = 'screen2Meow'
Button:
text: 'Go to outerscreen 1, but inside screenmanager sm2'
on_release:
# use saved id to move Screen between ScreenManagers
sm1.remove_widget(outer_screen_1)
sm2.add_widget(outer_screen_1)
# now we can use this Screen with sm2
sm2.current = 'outerScreen1' #This is where the problem is我在id中添加了一个outerScreen1。在问题区域,on_release代码现在将outerScreen1从sm1移动到sm2,并使其成为sm2的当前屏幕。
但是现在使用sm1的代码
Button:
text: 'Go to Screen 1'
on_release: sm1.current = 'outerScreen1'将失败,因为outerScreen1不再是sm1的子代。因此,如果您想要走这条路线,您必须跟踪outerScreen1在哪里,并根据需要更改它的父级。
这是一个很好的时间来考虑,仅仅制作另一个复制了Screen的outerScreen1是否会更简单。
https://stackoverflow.com/questions/60564166
复制相似问题