【问题标题】:How to call a function in Python from another screen class?如何从另一个屏幕类调用 Python 中的函数?
【发布时间】:2020-02-21 08:46:24
【问题描述】:
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()

假设我已经正确地完成了屏幕转换而不是添加以减少代码的体积,我在从设置屏幕更改菜单屏幕的背景时遇到了问题。这是你看到的暗模式,在此先感谢。 从 SettingsScreen 执行 MenuScreen.darkmode(self) 时未定义 Self。

【问题讨论】:

标签: python kivy


【解决方案1】:

您的问题是您将屏幕对象添加到屏幕管理器(您只会看到这些对象),然后您正在创建新对象并在那里进行更改。因此,由于您使用的是全局变量,因此最简单的解决方案是:

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

在类中,您可以对它们进行更改,例如:

menuscreen.darkmode()

附: 'self' 表示类的对象,在 Python 中,self 用于从该类中定义的函数访问类变量和函数。在这里,您不需要将“self”发送到另一个类,因为您将 SettingsScreen 类的对象发送到 MenuScreen 暗模式函数并且不对其执行任何操作。如果你想发送对象应该有:

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

# and receive it as obj for example
def darkmode (self, obj):
    ...

【讨论】:

    猜你喜欢
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-09
    • 2019-12-17
    • 1970-01-01
    相关资源
    最近更新 更多