2017-05-14 2 views
0

mein Projekt hat viele Python-Dateien, und jetzt ist das Problem, wenn ich auf die Schaltfläche in Main-UI-Schnittstelle geklickt hat, wird es einige Funktionen aufrufen eine andere Python-Datei (Unterprogramm), und ich brauche alle laufenden Status im Unterprogramm wird auch in Main-UI aktualisiert werden, wie mache ich das? Das Ding, das ich bis jetzt versuchen kann, ist bekannt, Socket verwendend, aber ich will wissen, haben Sie irgendwelche anderen guten Ideen auf diesem? Der Code wie folgt aus: 1. Main-UI:Wie aktualisiert man die Wxpython Statusleiste mit Laufzeitdaten Streaming in einer anderen * .py Datei

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): 

dieser maskierte Unter Skript ausführen können, aber was ich tun möchte, ist, sie zu ersetzen mit einer anderen Python-Datei aufgerufen wird

''' 
    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. Unterschrift:

import time class basicTest(): def run(self,inter): for i in range(inter): return i time.sleep(1)

Als Liste oben und ich auch bekannt, dass der Haupt-UI nur aktualisiert, wenn die Unter Skript fertig, es ist nicht von einer anderen Sub-Laufzeitaktualisierung, kann mir jemand helfen, sehr zu schätzen

Antwort

0

Ich würde den langen Lauf Code gerade verlassen in seinem Thread. Dann kannst du wxPython den Thread starten lassen. Verwenden Sie in der Thread-Methode run einfach eine der thread-sicheren Methoden von wxPython, um Ihre Benutzeroberfläche aufzurufen. Ich würde wx.CallAfter oder 'wx.PostEvent' empfehlen.

Sobald Sie das erledigt haben, führen Sie einfach die notwendige Methode in Ihrer Hauptbenutzeroberfläche aus.

Verwandte Themen