Как изменить переменную счетчика из другого класса и показать на экране kivy python - PullRequest
0 голосов
/ 06 апреля 2020

Пожалуйста, помогите мне с этой новой проблемой.

Я хочу увеличить переменную Num из ScreenOne Class из другого класса ScreenTwo по его функции Инкремент .

from kivymd.app import MDApp
from kivmob import TestIds ,RewardedListenerInterface,AdMobRewardedVideoAdListener ,KivMob
from kivymd.theming import ThemeManager
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):
        ScreenTwo().Increase()

class ScreenTwo(ScreenOne):
    def Increase(self):
        ScreenOne.Num +=1

Builder.load_string("""
#.import MDRaisedButton kivymd.uix.button.MDRaisedButton
<Screen_Manager>:
    ScreenOne:

<ScreenOne>:
    name:"One"
    Label:
        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()

Этот код дает мне ошибку

 TypeError: unsupported operand type(s) for +=: 'kivy.properties.NumericProperty' and 'int'

Пожалуйста, найдите мне способ увеличить переменную Num с класс ScreenTwo . и условие заключается в том, что он должен отображаться на экране Kivy

. Любая помощь будет оценена. Пожалуйста, помогите !!

1 Ответ

0 голосов
/ 06 апреля 2020

Я назначил 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...