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

Posted

技术标签:

【中文标题】在 Kivy 中制作(继续)选项屏幕【英文标题】:Making (Continuing) Option Screen in Kivy 【发布时间】:2019-03-26 01:01:29 【问题描述】:

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

如何保存用户的输入?

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()

【问题讨论】:

【参考方案1】:

之所以不保存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()

【讨论】:

eyllanesc 谢谢,谢谢!!我不敢相信这有效。我尝试了几十种方法来实现这一点……我仍然不明白你的方法是如何完美地工作的。我们的代码之间的主要区别是我使用global sm 和您的return self.root,对吗?你能解释一下为什么你的有效,也许为什么全局变量没有那么有效。再次感谢你让我看到我的缺陷。 @PetarLuketina 这里它与全局无关(但请避免使用它们:***.com/questions/19158339/…)。 假设有一个人的工厂,所以每次你打电话给那个工厂你都会得到一个婴儿,你喂它并且它长大,假设它已经会说话,但是如果你把它叫回工厂,它会给你一个不会说话的婴儿,所以你总是得到一个婴儿,这就是你打电话的 Popup 会发生的事情,并在我的解决方案中创建一个与你之前打电话的不同的婴儿 Popup只创建了一个Popup,然后我重用它,就像有了已经会说话的宝宝,我不再叫工厂我只叫我已经有的宝宝。 啊好吧。谢谢你的解释!

以上是关于在 Kivy 中制作(继续)选项屏幕的主要内容,如果未能解决你的问题,请参考以下文章

在kivy中制作一个切换到不同屏幕的按钮列表视图

Kivy Python-文本输入框填充整个浮动布局屏幕

Kivy 选项卡式面板不会更改背景颜色

只允许浮点数,带一个小数点和一个负号(Python/Kivy/Regex)

无法在 kivy 中获取导航抽屉

在 PyCharm 上导入 Kivy 时出现错误“[Core] 选项 --mode 无法识别”