如何使用另一个* .py文件中的运行时数据流更新Wxpython状态栏

时间:2017-05-14 07:36:29

标签: events wxpython runtime statusbar python-multithreading

我的项目有很多python文件,现在的问题是当我在Main-UI界面中点击按钮时,它会在另一个python文件(子程序)中调用一些函数,我需要在sub中的所有运行状态-program也将在主UI中更新,我该如何做到这一点? 到目前为止,我可以尝试使用套接字,但我想知道你们对此有什么其他好的想法吗? 像这样的代码: 1.主UI:

import wx,time
from threading import Thread
from path import basicTest
EVT_RESULT_ID = wx.NewId()
def EVT_RESULT(win, func):
  win.Connect(-1, -1, EVT_RESULT_ID, func)
class ResultEvent(wx.PyEvent):
  def __init__(self, data):
    wx.PyEvent.__init__(self)
    self.SetEventType(EVT_RESULT_ID)
    self.data = data
class TestThread(Thread):
  def __init__(self, wxObject):
    Thread.__init__(self)
    self.wxObject = wxObject
    self.start()
  def run(self):

这个被屏蔽的子脚本可以运行,但我想做的是用另一个python文件调用来替换它

'''
    for i in range(6):
      time.sleep(1)
      wx.PostEvent(self.wxObject, ResultEvent(i))
'''
    data = basicTest().run(10)
    wx.PostEvent(self.wxObject, ResultEvent(data))

class MyForm(wx.Frame):
  def __init__(self):
    wx.Frame.__init__(self, None, wx.ID_ANY, "Tester")
    panel = wx.Panel(self, wx.ID_ANY)
    self.btn = wx.Button(panel, label="Start Test")
    self.statusbar = self.CreateStatusBar()
    self.btn.Bind(wx.EVT_BUTTON, self.onButton)
    EVT_RESULT(self, self.updateStatus)
  def onButton(self, event):
    TestThread(self)
    btn = event.GetEventObject()
    btn.Disable()
  def updateStatus(self, msg):
    t = msg.data
    self.statusbar.SetStatusText("Sequence %i running.." %t)
    self.btn.Enable()
if __name__ == "__main__":
  app = wx.PySimpleApp()
  frame = MyForm().Show()
  app.MainLoop()
  1. 子脚本:
  2. import time class basicTest(): def run(self,inter): for i in range(inter): return i time.sleep(1)

    如上面的列表,我也知道主UI只在子脚本完成时更新,它不是来自另一个子的运行时刷新,任何人都可以帮助我,非常感谢

1 个答案:

答案 0 :(得分:0)

我只是将长时间运行的代码保留在其主题中。然后你可以让wxPython启动线程。在你的线程的run方法中,只需使用一个wxPython的线程安全方法来调用你的UI。我会推荐wx.CallAfter或' wx.PostEvent'。

完成后,您只需在主UI中执行必要的方法即可。