【问题标题】:Python crashing when updating wxPython GUI from thread从线程更新 wxPython GUI 时 Python 崩溃
【发布时间】:2014-03-25 07:01:25
【问题描述】:

我已广泛搜索解决问题的方法,但无济于事。 我正在编写一个程序,它有一个包含在普通窗口中的 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。

【问题讨论】:

    标签: python user-interface wxpython python-multithreading


    【解决方案1】:

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

    无论如何,您的应用程序都会崩溃,除非您使用线程来收集 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()
    

    【讨论】:

      猜你喜欢
      • 2018-10-10
      • 2012-12-12
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多