Я назначил id
на ScreenManager
и добавил этот менеджер к каждому Screen
<Screen_Manager>:
id: screen_manager
ScreenOne:
id: one
name: "One"
manager: screen_manager
ScreenTwo:
id: two
name:"Two"
manager: screen_manager
Таким образом, я могу получить доступ к другому окну, используя manager
и id
другого экрана.
class ScreenOne(Screen):
Num = NumericProperty(0)
def Increase(self):
# change in current Screen - ScreenOne
self.Num += 1
print('One:', self.Num)
# change in other Screen - ScreenTwo
self.manager.ids.two.Num += 2
print('Two:', self.manager.ids.two.Num)
# or
#self.manager.ids.two.Increase()
Полный рабочий код, который изменяет Num
на другом экране и с кнопками для просмотра других экранов.
from kivymd.app import MDApp
from kivymd.theming import ThemeManager
#from kivmob import TestIds, RewardedListenerInterface, AdMobRewardedVideoAdListener, KivMob
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.lang.builder import Builder
from kivy.uix.label import Label
from kivy.properties import NumericProperty
class Screen_Manager(ScreenManager):
pass
class ScreenOne(Screen):
Num = NumericProperty(0)
def Increase(self):
# change in current Screen - ScreenOne
self.Num += 1
print('One:', self.Num)
# change in other Screen - ScreenTwo
#self.manager.ids.two.Num += 2
#print('Two:', self.manager.ids.two.Num)
# or
self.manager.ids.two.Increase()
class ScreenTwo(ScreenOne):
def Increase(self):
# change in current Screen - ScreenTwo
self.Num += 2
print('Two:', self.Num)
Builder.load_string("""
#.import MDRaisedButton kivymd.uix.button.MDRaisedButton
<Screen_Manager>:
id: screen_manager
ScreenOne:
id: one
name: "One"
manager: screen_manager
ScreenTwo:
id: two
name:"Two"
manager: screen_manager
<ScreenOne>:
Label:
id: lb1
text: "Number " + str(root.Num)
pos_hint:{"center_x":0.5,"top":0.7}
MDRaisedButton:
text:"Click here"
pos_hint:{"center_x":0.5,"top":0.6}
on_release:
root.Increase()
MDRaisedButton:
text: "Go To Screen Two"
pos_hint:{"center_x":0.5,"top":0.1}
on_release:
root.manager.current = 'Two'
<ScreenTwo>:
Label:
id: lb2
text: "Number " + str(root.Num)
pos_hint:{"center_x":0.5,"top":0.7}
MDRaisedButton:
text:"Click here"
pos_hint:{"center_x":0.5,"top":0.6}
on_release:
root.Increase()
MDRaisedButton:
text: "Go To Screen One"
pos_hint:{"center_x":0.5,"top":0.1}
on_release:
root.manager.current = 'One'
""")
class TestApp(MDApp):
def __init__(self,**kwargs):
self.theme_cls.theme_style = "Dark"
super().__init__(**kwargs)
def build(self):
return Screen_Manager()
if __name__ == "__main__":
TestApp().run()
РЕДАКТИРОВАТЬ: кажется, вам не нужно присваивать screen_manager
на manager
, потому что он уже встроен manager
(или вы можете использовать встроенный parent
)
# using `id
#self.parent.ids.two.Increase()
self.manager.ids.two.Increase()
# using `name`
#self.parent.get_screen('Two').Increase()
self.manager.get_screen('Two').Increase()
Использование id
Вы должны установить идентификаторы в Screen_Manager
, а не в Screen
<Screen_Manager>:
ScreenOne:
id: one
ScreenTwo:
id: two
Но с помощью name
вы можете установить имена в Screen_Manager
или в Screen
from kivymd.app import MDApp
from kivymd.theming import ThemeManager
#from kivmob import TestIds, RewardedListenerInterface, AdMobRewardedVideoAdListener, KivMob
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.lang.builder import Builder
from kivy.uix.label import Label
from kivy.properties import NumericProperty
class Screen_Manager(ScreenManager):
pass
class ScreenOne(Screen):
Num = NumericProperty(0)
def Increase(self):
# change in current Screen - ScreenOne
self.Num += 1
print('One:', self.Num)
# change in other Screen - ScreenTwo
# using `id`
#self.parent.ids.two.Num += 2
#self.parent.ids.two.Increase()
#self.manager.ids.two.Num += 2
#self.manager.ids.two.Increase()
#print('Two:', self.manager.ids.two.Num)
# using `name`
#self.parent.get_screen('Two').Num += 2
#self.parent.get_screen('Two').Increase()
#self.manager.get_screen('Two').Num += 2
self.manager.get_screen('Two').Increase()
class ScreenTwo(ScreenOne):
def Increase(self):
# change in current Screen - ScreenTwo
self.Num += 2
print('Two:', self.Num)
Builder.load_string("""
#.import MDRaisedButton kivymd.uix.button.MDRaisedButton
<Screen_Manager>:
ScreenOne:
id: one
ScreenTwo:
id: two
<ScreenOne>:
name: "One"
other: "Two"
Label:
id: lb1
text: "Number " + str(root.Num)
pos_hint:{"center_x":0.5,"top":0.7}
MDRaisedButton:
text:"Click here"
pos_hint:{"center_x":0.5,"top":0.6}
on_release:
root.Increase()
MDRaisedButton:
text: "Go To Screen " + root.other
pos_hint:{"center_x":0.5,"top":0.1}
on_release:
root.manager.current = root.other
<ScreenTwo>:
name: "Two"
other: "One"
Label:
id: lb2
text: "Number " + str(root.Num)
pos_hint:{"center_x":0.5,"top":0.7}
MDRaisedButton:
text:"Click here"
pos_hint:{"center_x":0.5,"top":0.6}
on_release:
root.Increase()
MDRaisedButton:
text: "Go To Screen " + root.other
pos_hint:{"center_x":0.5,"top":0.1}
on_release:
root.manager.current = root.other
""")
class TestApp(MDApp):
def __init__(self,**kwargs):
self.theme_cls.theme_style = "Dark"
super().__init__(**kwargs)
def build(self):
return Screen_Manager()
if __name__ == "__main__":
TestApp().run()
Кстати: Вы можете использовать manager
или parent
, чтобы установить некоторые значения в ScreenManager
и поделиться ими со всеми Screens
.
РЕДАКТИРОВАТЬ: Использование наследования
class ScreenTwo(ScreenOne):
было ошибкой.
если ScreenTwo
не является Screen
, то вы можете создать его без наследования
class ScreenTwo():
и создать его в ScreenOne.__init__
. И отправьте ScreenOne
(self
) на ScreenTwo
, чтобы ScreenTwo
имел доступ к переменным в ScreenOne
class ScreenOne(Screen):
Num = NumericProperty(0)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.second = ScreenTwo(self) # create instance of `ScreenTwo` and send `ScreenOne` (self) as argument
def Increase(self):
self.second.Increase() # run `Increase()` from `ScreenTwo`
class ScreenTwo():
def __init__(self, other):
self.first = other # keep access to `ScreenOne`
def Increase(self):
self.first.Num +=1 # change `Num` in `ScreanOne`
Полный пример
from kivymd.app import MDApp
from kivymd.theming import ThemeManager
#from kivmob import TestIds, RewardedListenerInterface, AdMobRewardedVideoAdListener, KivMob
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.lang.builder import Builder
from kivy.uix.label import Label
from kivy.properties import NumericProperty
class Screen_Manager(ScreenManager):
pass
class ScreenOne(Screen):
Num = NumericProperty(0)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.second = ScreenTwo(self) # create instance of `ScreenTwo` and send `ScreenOne` (self) as argument
def Increase(self):
self.second.Increase() # run `Increase()` from `ScreenTwo`
class ScreenTwo():
def __init__(self, other):
self.first = other # keep access to `ScreenOne`
def Increase(self):
self.first.Num +=1 # change `Num` in `ScreanOne`
Builder.load_string("""
#.import MDRaisedButton kivymd.uix.button.MDRaisedButton
<Screen_Manager>:
ScreenOne:
<ScreenOne>:
name: "One"
Label:
id: lb1
text: "Number " + str(root.Num)
pos_hint:{"center_x":0.5,"top":0.7}
MDRaisedButton:
text:"Click here"
pos_hint:{"center_x":0.5,"top":0.6}
on_release:
root.Increase()
""")
class TestApp(MDApp):
def __init__(self,**kwargs):
self.theme_cls.theme_style = "Dark"
super().__init__(**kwargs)
def build(self):
return Screen_Manager()
if __name__ == "__main__":
TestApp().run()