我一直在尝试在关闭窗口后再次打开我的 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中发生这种情况)
在您的代码中,尝试替换:
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
流程。