python - wxpython 线程框架初始化错误

标签 python thread-safety wxpython

这是一个例子:

class DemoFrame(wx.Frame):
    def __init__(self, parent):
         wx.Frame.__init__(self, parent)
         self.panel = wx.Panel(self, -1)
         ...
         initialize other elements
         ...
         self.DoStuff()


    def DoStuff(self):
         self.panel.SetBackGroundColour(wx.Colour(240, 240, 240))
         ...
         do something
         ...

现在,正如您所知,这绝对不是初始化 GUI 的一个好例子,因为做某事很可能会在 GUI 运行时卡住 GUI,所以我将其调整为:

import threading

class DemoFrame(wx.Frame):
    def __init__(self, parent):
         wx.Frame.__init__(self, parent)
         self.panel = wx.Panel(self, -1)
         ...
         initialize other elements
         ...
         DoStuffThead = threading.Thread(target = self.DoStuff, ())
         DoStuffThead.start()


    def DoStuff(self):
         wx.CallAfter(self.ChangeBG, )

         ...
         do something
         ...

    def ChangeBG(self):
         self.panel.SetBackGroundColour(wx.Colour(240, 240, 240))

上面的代码应该与第一个代码在 do Something 为空白时完全相同,但令我惊讶的是,我注意到在运行后面的代码时几乎没有背景绘制故障。

哪部分出了问题?这不是在线程中更新 GUI 的正确方法吗?

最佳答案

从工作线程更新 GUI 是一种糟糕的方法,而不是说它不是线程安全的事件。 您必须与主线程通信才能更新 GUI。

达到预期结果的最佳方法是使用wx.PostEvent方法。您可以根据需要创建自定义事件,继承自wx.PyEvent,并且最好继承threading.Thread以将要在该线程类中通信的窗口保留为实例变量。

有关如何更新具有长时间运行任务的 GUI 的最佳说明可以在 wxPython wiki 中找到。 (第一个例子)。

关于python - wxpython 线程框架初始化错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18271696/

相关文章:

python - Pandas:根据另一列的值打印一列的值

c++ - 在 C++ 中,如何重用已完成执行的标准线程?

java - 这段代码线程安全吗?静态方法修改httpservletrequest

java - 为什么 ThreadGroup 会受到批评?

python - 我使用 wxPython 创建了一个 GUI,当我运行我的应用程序时,这些函数没有执行

python - Python的unittest中向TestCase添加元数据

c# - 使用 TPL 的协作式多任务处理

python - 如何使用uwsgi挂载Django App?

python - wxPython:可折叠面板小部件

python - 如何在不杀死 iPython 的情况下杀死 python 脚本?