从线程更新wxPython GUI时Python崩溃

时间:2014-03-25 07:01:26

标签: python user-interface wxpython python-multithreading

我已经广泛搜索了解决这个问题的方法,但我无济于事。 我正在编写一个程序,其中包含一个包含在普通窗口内的wxPython Html窗口。当程序启动时,它会产生几个线程来检查站点上的新图像,如果发现它们应该显示在wxPython Html窗口中。我通过调用GUI类中的函数来执行此操作。

def appendPage(self, text):
    self.Freeze()
    self.htmlwin.AppendToPage(text)
    self.Thaw()

(文本变量是显示抓取图像的html代码)

从收集图像文件URL的其中一个线程调用此函数。我在调用appendPage函数时以及调用AppendToPage方法时尝试使用wx.CallAfter方法。无论如何,程序停止并且" Python.exe已停止工作"出现。对不起,如果我不清楚,我没有包含示例代码,因为此错误来自的程序非常大并且使用了几个外部库。为了让线程更新GUI,我真的不知所措。

1 个答案:

答案 0 :(得分:0)

解决方案很简单,不要使用线程和图形库交织在一起。

你的应用程序无论如何都会崩溃,除非你使用线程来收集GUI从thread.join()或类似的东西中提取的数据,那么你就没事了。
只要您尝试从其他线程更新任何图形元素,您就会对应用程序进行分段
这就是所有图形库的工作原理(为什么?我不知道它是诚实的,但它与锁有关,在线程之间访问内存可能因此你不会从多个来源写入图形卡有一件事是肯定的,主要是因为渲染引擎的复杂性将成为理解和维护的错误..而且它的回报并不是那么好。) >
您可以做的是使用select.epoll代替线程来收集数据,您不需要线程来获取数据,但您不会锁定等待数据的应用程序。

这只是为了让您了解如何解决问题,而不是让线程调用图形更改的工作,可以反转更改,以便从线程中获取数据。

另一种方法是简单地为线程提供mainWindow的局部变量,例如self.data,并且只需为每个渲染序列将图形元素更新为self.htmlwin.AppendToPage(self.data)

class mainWindow():
    def __init__(self):
        self.thread = start_thread('http://google.com')
    def appendPage(self, text):
        self.Freeze()
        self.htmlwin.AppendToPage(text)
        self.Thaw()
    def run(self):
        while self.alive:
            self.append(self.thread.data)
            self.render()