wxPython-更改子进程中的状态栏文本

wxPython-更改子进程中的状态栏文本,wxpython,Wxpython,我的代码(ubuntu18.04、python2.7、wxpython4)创建了一个带有状态栏的用户界面,然后启动了一个子进程。新进程尝试更新状态栏文本,但更改不会显示在状态栏中 示例代码显示了我试图实现的目标: 导入wx,多处理 类MyFrame(wx.Frame): 定义初始(自我、父母、头衔): wx.Frame.\uuuuu init\uuuuuuuuux(self,parent,title=title,size=300200)) self.sb=self.CreateStatusBar

我的代码(ubuntu18.04、python2.7、wxpython4)创建了一个带有状态栏的用户界面,然后启动了一个子进程。新进程尝试更新状态栏文本,但更改不会显示在状态栏中

示例代码显示了我试图实现的目标:

导入wx,多处理
类MyFrame(wx.Frame):
定义初始(自我、父母、头衔):
wx.Frame.\uuuuu init\uuuuuuuuux(self,parent,title=title,size=300200))
self.sb=self.CreateStatusBar()
self.sb.SetStatusText(“原始文本”)
自我展示(真实)
def doWork():
印上“嫁妆”
打印frame.sb.GetStatusText()
frame.sb.SetStatusText(“新东西”)
打印frame.sb.GetStatusText()
p=multiprocessing.Process(target=doWork,args=())
app=wx.app(假)
frame=MyFrame(无,“状态文本”)
p、 开始()
app.MainLoop()

doWork
进程可以访问和打印原始状态栏文本,并且它似乎能够设置状态文本(基于第二次打印的结果)。但状态栏中显示的文本不会更改。有什么方法可以从单独的进程更新状态栏文本吗?

Gui程序在其主循环中运行,我相信更新必须在主循环中进行。(有人可能会在这里澄清,或者事实上,告诉我我错了)

通常实现这一点的方法是从
wx.lib.newevent
或使用类似
pubsub
的方法生成事件。然而,这些通常是通过
线程
而不是
进程
生成的,同样地,有人可能会纠正我(我和下一个人一样模糊)

请参见此处:
这里:
背景资料

以下是详细的解决方案:

答案似乎是使用
多处理
中的
队列
,并使用
wx.Timer
定期检查该队列是否有任何更新

我已经编写了一个快速脚本,用您的代码演示了一个解决方案。至少,这应该是一个合理的起点,你可以从中进步。
除了最初更改状态文本外,它还每5秒更新一次,以证明这一点

import multiprocessing
import wx

class MyFrame(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(300,200))
        self.sb = self.CreateStatusBar()
        self.sb.SetStatusText('Original text')
        self.Show(True)
        self.timer = wx.Timer(self)
        self.process_timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.poll, self.timer)
        self.Bind(wx.EVT_TIMER, self.process, self.process_timer)
        self.timer.Start(1000)
        self.process_timer.Start(5000)
        self.cnt = 0

    # Poll for a queue entry with which to update the statusbar
    def poll(self, event):
        print("Polling")
        if q.empty():
            return
        q_mess = q.get()
        self.sb.SetStatusText(q_mess)

    #Fire off a new process every 5 seconds to demonstrate the update
    def process(self, event):
        self.cnt += 1
        p = multiprocessing.Process(target=doWork, args=(q,self.cnt))
        p.start()

def doWork(q,cnt=0):
    print ('In doWork')
    q.put("New status "+str(cnt))

q = multiprocessing.Queue()
p = multiprocessing.Process(target=doWork, args=(q,0))
app = wx.App(False)
frame = MyFrame(None, 'Status Text')
p.start()
app.MainLoop()