Как вызвать функцию в Python из другого класса экрана? - PullRequest
1 голос
/ 21 февраля 2020
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanger import ScreenManager, Screen

Builder.load_string("""
<MenuScreen>:
    BoxLayout:
        FloatLayout:
            Image:
                id: homebackg
                pos: 0, 0
                source: "dark.png"
<SettingsScreen>:
    BoxLayout:
        FloatLayout:
            Image:
                id: settingsbackg
                pos: 0, 0
                source: "dark.png"
            Button:
                text: ""
                color: 1.0, 1.0, 1.0, 0.0
                on_press:
                    root.buttonclick()
""")

class MenuScreen(Screen):
    def darkmode(self):
        self.ids.homebackg.source = "dark.png"
    def litemode(self):
        self.ids.homebackg.source = "lite.png"

class SettingsScreen(Screen):
    def darkmode(self):
        self.ids.settingsbackg.source = "dark.png"
    def litemode(self):
        self.ids.settingsbackg.source = "lite.png"
    def buttonclick(self):
        file = open("stat.txt", "r")
        themestat = file.read()
        file.close()
        if themestat == "lite":
            SettingsScreen.darkmode(self)
            MenuScreen.darkmode(self)
            file = open("stat.txt", "w")
            file.write("dark")
            file.close()
        elif themestat == "dark":
            SettingsScreen.litemode(self)
            MenuScreen.litemode(self)
            file = open("stat.txt", "w")
            file.write("lite")
            file.close()

sm = ScreenManager()
sm.add_widget(MenuScreen(name='menu'))
sm.add_widget(SettingsScreen(name='settings'))

class MyApp(App):
    def build(self):
        return sm

if __name__ == '__main__':
    MyApp().run()

Предположим, что я правильно выполнил переходы экрана, не добавляя их, чтобы сделать код менее громоздким, у меня возникла проблема с изменением фона экрана меню с помощью настройки экрана. Видите ли, за темный режим, спасибо заранее. Self не определяется при выполнении MenuScreen.darkmode (self) из SettingsScreen.

1 Ответ

1 голос
/ 21 февраля 2020

Ваша проблема в том, что вы добавляете объекты экранов в менеджер экрана (и вы увидите только эти объекты), а затем вы создаете новые объекты и вносите в них изменения. Так как вы используете глобальные переменные, самое простое решение будет:

sm = ScreenManager()
menuscreen = MenuScreen(name='menu')
settingsscreen = SettingsScreen(name='settings')
sm.add_widget(menuscreen)
sm.add_widget(settingsscreen)

А внутри классов вы можете просто внести в них изменения, например:

menuscreen.darkmode()

PS «self» означает объект класса, в Python self используется для доступа к переменным и функциям класса из функций, определенных в этом классе. И здесь вам не нужно отправлять 'self' другому классу, потому что вы отправляете объект класса SettingsScreen в функцию darkmode MenuScreen и ничего с этим не делаете. Если вы хотите отправить объект, должно быть:

# you send object of SettingsScreen
menuscreen.darkmode(self)

# and receive it as obj for example
def darkmode (self, obj):
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...