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)

Kivy:为长功能加载动画(避免冻结)

Kivy 和无限线程循环 - 应用程序冻结

Python Kivy:正确启动更新 GUI 元素的后台进程

从终端启动 kivy GUI 应用程序