Kivy GUI 冻结
Posted
技术标签:
【中文标题】Kivy GUI 冻结【英文标题】:Kivy GUI Freezes 【发布时间】:2020-08-06 22:17:15 【问题描述】:我的 KIVY-GUI 随机冻结,我不太清楚为什么。我从 python 端更改了几个小部件(即启用复选框、更改文本输入文本等),有时从循环更改(即一个接一个地启用 6 个复选框)。我认为冻结主要发生在我一次禁用很多小部件时,但是它也发生在只更改一个小部件时。通过转到 shell 窗口并按 CTRL+C,我可以再次解冻 GUI。有时 GUI 会崩溃并出现以下错误:
[INFO ] [Base ] Leaving application in progress...
Traceback (most recent call last):
File "GUI_MELC.py", line 637, in <module>
GUI_MELC().run()
File "C:\Python37\lib\site-packages\kivy\app.py", line 855, in run
runTouchApp()
File "C:\Python37\lib\site-packages\kivy\base.py", line 504, in runTouchApp
EventLoop.window.mainloop()
File "C:\Python37\lib\site-packages\kivy\core\window\window_sdl2.py", line 747, in mainloop
self._mainloop()
File "C:\Python37\lib\site-packages\kivy\core\window\window_sdl2.py", line 479, in _mainloop
EventLoop.idle()
File "C:\Python37\lib\site-packages\kivy\base.py", line 339, in idle
Clock.tick()
File "C:\Python37\lib\site-packages\kivy\clock.py", line 563, in tick
current = self.idle()
File "C:\Python37\lib\site-packages\kivy\clock.py", line 543, in idle
usleep(1000000 * sleeptime)
File "C:\Python37\lib\site-packages\kivy\clock.py", line 727, in usleep
_usleep(microseconds, self._sleep_obj)
File "C:\Python37\lib\site-packages\kivy\clock.py", line 405, in _usleep
_kernel32.WaitForSingleObject(obj, 0xffffffff)
KeyboardInterrupt
我如何禁用小部件的一些示例代码(这可能是最耗时的,如果你可以这样称呼它):
guiElements = []
temp=['redAll', 'greenAll', 'blueAll']
guiElements.extend(temp)
for i in range(6):
temp1='red'+str(i)
temp2='gre'+str(i)
temp3='blu'+str(i)
temp4='red'+str(i)+'Val'
temp5='gre'+str(i)+'Val'
temp6='blu'+str(i)+'Val'
tempList=[temp1, temp2, temp3, temp4, temp5, temp6]
guiElements.extend(tempList)
def disableMainBoxGUI(self, status):
#self.getGUIElements()
for i in self.guiElements:
self.ids[i].disabled = status
有没有办法避免 GUI 冻结?我必须添加 time.sleep(XX) 还是什么?
【问题讨论】:
请发minimal reproducible example。 【参考方案1】:只是一些简单的建议 - 学习使用线程。它并不复杂,它对运行长循环有很大帮助。我建议阅读this 以熟悉自己。线程将加速您的应用程序并消除 GUI 冻结。我几乎在每个项目中都使用 ThreadPoolExecutor,但您只需要一个简单的守护线程。希望这有帮助!
【讨论】:
以上是关于Kivy GUI 冻结的主要内容,如果未能解决你的问题,请参考以下文章
SDL2 错误:使用 pyinstaller 冻结 kivy 应用程序时“无法加载图像 <default.png>”
在未调用 Popup.open() 的方法中触发 Popup.dismiss() (kivy)