gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:56:17 25 4
gpt4 key购买 nike

这是一个例子:

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 的好示例,因为 do something 很可能会在 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 以将您想要在该线程类中进行通信的窗口作为实例变量。

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com