我广泛地寻找这个问题的解决办法,但没有成功。 我正在编写一个程序,它在一个普通窗口中包含一个wxpythonhtml窗口。当程序启动时,它会生成多个线程,这些线程检查站点上的新图像,如果找到,它们应该显示在wxpythonhtml窗口中。我是通过调用GUI类中的函数来实现的。在
def appendPage(self, text):
self.Freeze()
self.htmlwin.AppendToPage(text)
self.Thaw()
(text变量是显示刮取图像的html代码)
此函数从收集图像文件URL的线程之一调用。我试过用wx.CallAfter公司方法调用appendPage函数以及调用AppendToPage方法时。不管怎样,程序停止并且“Python.exe出现“已停止工作”。抱歉,如果我不太清楚,我没有包括示例代码,因为这个错误来自的程序非常大,并且使用了几个外部库。为了让线程更新GUI,我真的不知所措。在
解决方案很简单,不要将线程和图形库交织在一起。
无论发生什么情况,应用程序都会崩溃,除非您使用线程收集GUI从
thread.join()
或类似的数据,否则您没问题。只要您尝试从另一个线程更新任何图形元素,您就会分离应用程序。
这就是所有图形库的工作原理(为什么?我不知道说实话,但这与锁有关,可能是线程之间的内存访问,所以你不会一次从多个源向显卡写东西。有一件事是肯定的,主要是因为渲染引擎的复杂性会让人难以理解和维护。。而且它的回报也不是那么好)。
您可以使用
select.epoll
而不是线程来收集数据,您不需要线程来获取数据,但也不会锁定等待数据的应用程序。在这只是为了让您了解如何解决问题,而不是让线程执行调用图形化更改的任务,而是可以反转更改,以便从线程获取数据。在
另一种方法是简单地给线程一个mainWindow的局部变量,比如
self.data
,并为每个呈现序列将图形元素更新为self.htmlwin.AppendToPage(self.data)
。在相关问题 更多 >
编程相关推荐