Вы можете делать то, что вы хотите, но это требует отвратительного взлома. Чтобы установить текущий Screen
для ScreenManager
, этот Screen
должен быть дочерним по отношению к ScreenManager
. Но любой Widget
(включая Screens
) может иметь только одного родителя. Таким образом, уродливый хак должен переместить Screen
между ScreenManagers
по мере необходимости.
Часть измененной версии вашего kv
реализует часть хака:
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
. Итак, если вы хотите go этот маршрут, вы должны отслеживать, где находится outerScreen1
, и при необходимости менять его родителя.
Это хорошее время, чтобы подумать, просто ли сделать еще один Screen
дубликаты outerScreen1
могут быть проще.