如何在 kivy 中的按钮按下事件中打开新的 Window?

How to open new Window on button press event in kivy?

我希望在 kivy 中点击按钮打开新的 window ... 我目前正在尝试的是创建另一个 class 的实例,它继承了 kivy.App.

class SettingScreen(App):
    pass

class Screen(Widget):
    btn = ObjectProperty(None)
    def btn_touch_up(self):
       print("Touch Up ")
       SettingScreen().run()

class TouchApp(App):
def build(self):
    return Screen()

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

单击按钮后发生的事情是我的 window 的标题已更改,但是 Window 没有出现 blank.that 我现有的小部件仍在 window

touch.ky

<Screen>:
btn:btn
Label:
    id: msg
    text: "Hii"
    color: 1,0,0,1

    pos_hint: {"top":0.8}
Button:
    id: btn
    size_hint: 0.2,0.2
    text: "Touch Me"
    on_touch_up: root.btn_touch_up()

不建议在一个Kivy应用或Python脚本中有两个应用class。

我们会将SettingScreen分离到另一个Kivy应用中,并使用popen启动SettingScreen

例子

touch.py

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import Screen
from kivy.properties import ObjectProperty
from kivy.lang import Builder


Builder.load_string("""
<Screen>:
    btn:btn
    orientation: 'vertical'
    Label:
        id: msg
        text: "Hi"
        color: 1,0,0,1
        pos_hint: {"top":0.8}

    Button:
        id: btn
        size_hint: 0.2,0.2
        text: "Touch Me"
        on_release:  root.btn_touch_up()

""")


class Screen(BoxLayout):
    btn = ObjectProperty(None)

    def btn_touch_up(self):
        print("Touch Up ")
        from subprocess import Popen, PIPE
        process = Popen(['python3', 'settings.py'], stdout=PIPE, stderr=PIPE)


class TouchApp(App):
    def build(self):
        return Screen()


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

settings.py

from kivy.app import App
from kivy.lang import Builder


kv = Builder.load_string("""
Screen:
    BoxLayout:
        orientation: 'vertical'
        Label:
            text: 'Setting Screen'
        Button:
            text: 'Exit'
            on_release: app.stop()
""")


class SettingScreen(App):

    def build(self):
        return kv


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

输出