我的GUI由一个标题栏和一个状态更新的底部栏组成,其中标题栏带有控制中间的屏幕管理器的按钮,然后是实际的屏幕管理器。
通常,我用顶部的按钮控制中间的屏幕。简单。现在我的问题是,这些屏幕之一已经非常复杂,而且我有一个问题,就是我有很多凹痕。.所以,我们开始: 我想在另一个screenmanager 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'
答案 0 :(得分:0)
您可以做您想做的事,但这需要一个难看的技巧。为了设置Screen
的当前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
可能会更简单的时候。