从线程更新wxPython Gui时Python崩溃

2024-06-17 15:46:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我广泛地寻找这个问题的解决办法,但没有成功。 我正在编写一个程序,它在一个普通窗口中包含一个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,我真的不知所措。在


Tags: 方法函数代码text图像self程序站点
1条回答
网友
1楼 · 发布于 2024-06-17 15:46:21

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

无论发生什么情况,应用程序都会崩溃,除非您使用线程收集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()

相关问题 更多 >