从线程更新wxpythongui时Python崩溃

从线程更新wxpythongui时Python崩溃,python,user-interface,wxpython,python-multithreading,Python,User Interface,Wxpython,Python Multithreading,我已经广泛地寻找解决这个问题的办法,但毫无结果。 我正在编写一个程序,它在一个普通窗口中包含一个wxPython Html窗口。当程序启动时,它会产生几个线程来检查站点上的新图像,如果找到这些图像,它们应该显示在wxpythonhtml窗口中。我是通过调用GUI类中的函数来实现这一点的 def appendPage(self, text): self.Freeze() self.htmlwin.AppendToPage(text) self.Thaw() 文本变量是用于

我已经广泛地寻找解决这个问题的办法,但毫无结果。 我正在编写一个程序,它在一个普通窗口中包含一个wxPython Html窗口。当程序启动时,它会产生几个线程来检查站点上的新图像,如果找到这些图像,它们应该显示在wxpythonhtml窗口中。我是通过调用GUI类中的函数来实现这一点的

def appendPage(self, text):
    self.Freeze()
    self.htmlwin.AppendToPage(text)
    self.Thaw()
文本变量是用于显示刮取图像的html代码


从收集图像文件URL的线程之一调用此函数。在调用appendPage函数和AppendToPage方法时,我尝试过使用wx.CallAfter方法。无论如何,程序将停止,并且Python.exe已停止工作。抱歉,如果我不是非常清楚,我没有包括示例代码,因为这个错误来自的程序非常大,并且使用了几个外部库。我真的不知道我需要做什么才能让线程更新GUI

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

无论发生什么情况,您的应用程序都会崩溃,除非您使用线程收集GUI从thread.join或类似文件中获取的数据,否则一切正常。 只要您尝试从另一个线程更新任何图形元素,您就会对应用程序进行故障隔离。 这就是所有图形库的工作原理为什么?老实说,我不知道,但这与锁有关,线程之间的内存访问可能是为了避免一次从多个源向图形卡写入内容。有一件事是肯定的,主要是因为渲染引擎的复杂性会让人难以理解和维护。。从中得到的回报也不是那么好。 您可以使用select.epoll而不是线程来收集数据,您不需要线程来获取数据,但也不会锁定等待数据的应用程序

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

另一种方法是简单地给线程一个mainWindow的局部变量,例如self.data,并为每个渲染序列将图形元素更新为self.htmlwin.AppendToPageself.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()