我的项目有很多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):
'''
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()
import time
class basicTest():
def run(self,inter):
for i in range(inter):
return i
time.sleep(1)
如上面的列表,我也知道主UI只在子脚本完成时更新,它不是来自另一个子的运行时刷新,任何人都可以帮助我,非常感谢
答案 0 :(得分:0)
我只是将长时间运行的代码保留在其主题中。然后你可以让wxPython启动线程。在你的线程的run
方法中,只需使用一个wxPython的线程安全方法来调用你的UI。我会推荐wx.CallAfter
或' wx.PostEvent'。
完成后,您只需在主UI中执行必要的方法即可。