如何在使用 ESC 键后重新启动 kivy 窗口

问题描述 投票:0回答:1

如何在使用 ESC 键后重新启动 kivy 窗口

我一直在尝试在关闭窗口后再次打开我的 kivy 应用程序(因为它是一个托盘应用程序)。 但是,当使用 Esc 键关闭应用程序然后重新运行应用程序时,我遇到了异常。

当我通过单击窗口栏中的十字来关闭窗口时,不会发生此错误。

这是重现该问题的一些代码示例:

from time import sleep

from kivy.app import App
from kivy.core.window import Window
from kivy.uix.widget import Widget


class MyApp(App):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.my_window = Widget()

    def build(self):
        return self.my_window

    def on_stop(self):
        Window.hide()


if __name__ == '__main__':
    Window.top = 30
    app = MyApp()
    app.run()
    # Restart the App after one second
    sleep(1)
    Window.show()
    app.run()

使用 esc 键关闭第一个窗口时,第二个窗口不会出现。相反,我收到了这个:

Connected to pydev debugger (build 223.8836.43)
[INFO   ] WM_MotionEventProvider <kivy.input.providers.wm_touch.WM_MotionEventProvider object at 0x0000016E2A86E790>
[INFO   ] WM_MotionEventProvider <kivy.input.providers.wm_touch.WM_MotionEventProvider object at 0x0000016E2A8816D0>
[ERROR  ] [Base        ] No event listeners have been created
[ERROR  ] [Base        ] Application will leave
python-BaseException

有什么办法可以避免这个问题吗?

(在python3.11和windows11上的kivy2.3.0中发生这种情况)

python kivy windows-11
1个回答
0
投票

在您的代码中,尝试替换:

Window.show()
app.run()

与:

file = sys.argv[0]
try:
    if os.path.exists(file):
        print('running 1: os.execl(', sys.executable, 'python', file)
        os.execl(sys.executable, 'python', file)
    else:
        print('running 2: os.execl(', sys.executable, 'python', os.path.join(os.getcwd(), file))
        os.execl(sys.executable, 'python', os.path.join(os.getcwd(), file))
except Exception as ex:
    print(ex)

这会将当前流程替换为新的

python
流程。

© www.soinside.com 2019 - 2024. All rights reserved.