如何从另一个屏幕类调用Python中的函数?

2024-06-01 04:54:07 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: fromselfidssourcepngdeflitefile
1条回答
网友
1楼 · 发布于 2024-06-01 04:54:07

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

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 darkmode函数,并且不做任何处理。如果要发送对象,应该有:

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

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

相关问题 更多 >