Events 如何使用另一个*.py文件中的运行时数据流更新Wxpython状态栏
我的项目有很多python文件,现在的问题是,当我点击主界面中的按钮时,它会调用另一个python文件(子程序)中的一些函数,我需要子程序中的所有运行状态也会在主界面中更新,我如何做到这一点? 到目前为止,我知道我可以尝试使用socket,但我想知道你们在这方面还有什么好主意吗? 代码如下所示: 1.主用户界面:Events 如何使用另一个*.py文件中的运行时数据流更新Wxpython状态栏,events,wxpython,runtime,statusbar,python-multithreading,Events,Wxpython,Runtime,Statusbar,Python Multithreading,我的项目有很多python文件,现在的问题是,当我点击主界面中的按钮时,它会调用另一个python文件(子程序)中的一些函数,我需要子程序中的所有运行状态也会在主界面中更新,我如何做到这一点? 到目前为止,我知道我可以尝试使用socket,但我想知道你们在这方面还有什么好主意吗? 代码如下所示: 1.主用户界面: import wx,time from threading import Thread from path import basicTest EVT_RESULT_ID = wx.Ne
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文件调用来替换它
导入时间
类basicTest():
def运行(自身、内部):
对于范围内的i(内部):
返回i
时间。睡眠(1)
正如上面的列表,我也知道主UI只有在子脚本完成时才会更新,它不是来自另一个子脚本的运行时刷新,任何人都可以帮助我,非常感谢我将长时间运行的代码留在它的线程中。然后你可以让wxPython启动线程。在线程的
run
方法中,只需使用wxPython的线程安全方法之一来调用UI。我建议使用wx.CallAfter
或“wx.PostEvent”
完成后,您只需在主UI中执行必要的方法
'''
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()