Создание (продолжение) экрана настроек в Киви - PullRequest
0 голосов
/ 22 октября 2018

Я работаю над тем, чтобы меню опций было одинаковым на всех моих экранах.Меню опций - это всплывающее окно с несколькими опциями.Когда вызывается всплывающее окно, оно не сохраняет входные данные.Когда кнопка «Переключатель» становится неактивной, по умолчанию она снова становится активной после того, как пользователь закрывает и снова открывает всплывающее окно.

Как сохранить введенные пользователем данные?

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 Ответ

0 голосов
/ 22 октября 2018

Причина, по которой он не сохраняет статус виджета, заключается в том, что вы создаете новый виджет в каждый момент , поэтому решение заключается в повторном использовании .С другой стороны, избегайте использования глобальных переменных, потому что они могут вызвать проблемы, в тех случаях, когда они должны использоваться.Учитывая вышеизложенное, решение выглядит следующим образом:

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