在 Kivy 中制作(继续)选项屏幕

Making (Continuing) Option Screen in Kivy

我正在努力获得一个在我的所有屏幕上都相同的选项菜单。选项菜单是一个带有几个选项的弹出窗口。调用弹出窗口时,它不会保存输入。当切换按钮更改为非活动状态时,它会在用户关闭并重新打开弹出窗口后默认恢复为活动状态。

如何保存用户的输入?

from kivy.app import App
from kivy.core.window import Window
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.popup import Popup
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.switch import Switch

Builder.load_string('''

<OptionMenu@Button>:
    text: "Option Menu"
    size_hint_y: .3
    on_press:
        app.option_menu_function()

<BoxLayout@BoxLayout>:
    orientation: "vertical"

<HomeScreen>:
    BoxLayout:
        OptionMenu:
        Label:
            text: "Home Screen"
        Button:
            text: "Next Screen >"
            on_release:
                app.root.current = "screen1"
<Screen1>:
    BoxLayout:
        OptionMenu:
        Label:
            text: "Screen 2"
        Button:
            text: "Next Screen >"
            on_release:
                app.root.current = "homescreen"
<SM>:
    name: "sm"
    id: sm
    HomeScreen:
        name: "homescreen"
        id: hs
    Screen1:
        name: "screen1"
        id: s1
''')

class HomeScreen(Screen):
    pass
class Screen1(Screen):
    pass
class SM(ScreenManager):
    pass

class MyApp(App):

    def build(self):
        global sm
        sm = SM()
        return sm

    def option_menu_function(self):
        box = BoxLayout(orientation = "horizontal")
        switch = Switch(active = True)
        popup = Popup(content = box, auto_dismiss = True, size_hint = (None, None), size = (Window.width/1.5, Window.width/1.5))
        box.add_widget(switch)
        popup.open()

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

之所以不保存widget的状态,是因为你每时每刻都在创建一个新的widget,所以解决办法就是重用。另一方面避免使用全局变量,因为它们会导致问题,在某些情况下必须使用它们。综合以上,解决方案如下:

class MyApp(App):
    def build(self):
        box = BoxLayout(orientation = "horizontal")
        box.add_widget(Switch(active = True))
        # a single popup is created
        self.popup = Popup(content = box, auto_dismiss = True, size_hint = (None, None), size = (Window.width/1.5, Window.width/1.5))

        self.root = SM()
        return self.root

    def option_menu_function(self):
        self.popup.open()