wxPython-更改子进程中的状态栏文本
我的代码(ubuntu18.04、python2.7、wxpython4)创建了一个带有状态栏的用户界面,然后启动了一个子进程。新进程尝试更新状态栏文本,但更改不会显示在状态栏中 示例代码显示了我试图实现的目标: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
导入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()