2017-05-14 2 views
0

mon projet a beaucoup de fichiers python, et maintenant le problème est lorsque je clique sur le bouton dans l'interface Main-IU, il va invoquer une fonction dans un autre fichier python (sous-programme), et j'ai besoin de tout le statut en cours dans le sous-programme sera également mis à jour dans l'interface principale, comment puis-je accomplir cela? La chose que je peux essayer jusqu'à présent, je sais utilise socket, mais je veux savoir si vous avez d'autres bonnes idées sur ce sujet? Le code comme ceci: 1. Main-UI:Comment mettre à jour la barre d'état Wxpython avec streaming de données d'exécution dans un autre fichier * .py

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

ce sous-script masqué peut fonctionner, mais ce que je veux faire est de le remplacer par l'invocation d'un autre fichier 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. sous-script:

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

Comme la liste ci-dessus et aussi je sais que l'interface principale seulement mis à jour lorsque le sous-script terminé, il ne rafraîchit pas d'un autre sous, peut-on m'aider, très apprécier

Répondre

0

Je voudrais juste laisser le long code dans son fil. Ensuite, vous pouvez avoir wxPython démarrer le thread. Dans la méthode run de votre thread, utilisez simplement l'une des méthodes thread-safe de wxPython pour appeler votre interface utilisateur. Je recommanderais wx.CallAfter ou "wx.PostEvent". Une fois que vous avez fait cela, alors vous exécutez simplement la méthode nécessaire dans votre interface utilisateur principale.