#!/usr/bin/env python # -*- coding: utf-8 -*- import wx, os, threading, time #Shell prikaz s dlouhym prubehem COMMAND = 'find / -name "*.*~"' COMMAND = 'ls -l' # Prirazeni ID novemu eventu, ktery se bude volat ve #vlakne procesu EVT_RESULT_ID = wx.NewId() class InfoWindow(wx.MiniFrame): def __init__(self,parent,infotext): self.parent = parent self.infotext = infotext wx.MiniFrame.__init__(self,parent,-1,title='Info o průběhu procesu') wx.StaticText(self,-1,self.infotext) self.status = wx.StaticText(self, -1, 'Čekejte pracuji...', pos=(0,20)) #Napojeni eventu pro indikaci konce threadu k oknu InfoWindow: self.Connect(-1, -1, EVT_RESULT_ID, self.onResult) self.parent.Disable() def onResult(self, event): """ Tato metoda se vola vzdy, kdyz proces v threadu zavola funkci wx.PostEvent """ if event.data == None: self.parent.Enable() self.Destroy() class WorkerThread(threading.Thread): """Trida vlakna nove spusteneho procesu""" def __init__(self, notify_window, command): """Init Worker Thread Class.""" threading.Thread.__init__(self) self._notify_window = notify_window self._want_abort = 0 self.command = command #self.start nastartuje vlastni proces, ale toto volani se da presunou #take do nejake akce gui widgetu: self.start() def run(self): """Spousti proces v novem vlaknu""" r = os.popen(self.command) for eachResult in r: #Zde bychom mohli posilat nejakou informaci widgetu "_notify_window" #Napriklad vysledek prikazu treba takto: #wx.PostEvent(self._notify_window, ResultEvent(eachResult)) pass #pokud bude prikaz vykonan rychle, nechame okno chvilku zobrazene, #at neni uzivatel prilis zmaten a muze si alespon precist co se delo: time.sleep(1) #Po skonceni procesu posleme do InfoWindow "None" a #Infowindow se zavre wx.PostEvent(self._notify_window, ResultEvent(None)) class ResultEvent(wx.PyEvent): """Generuje event EVT_RESULT_ID a nese sebou doplnkova data""" def __init__(self, data): """Init Result Event.""" wx.PyEvent.__init__(self) self.SetEventType(EVT_RESULT_ID) self.data = data class StartButton(wx.Button): def __init__(self, parent): self.parent = parent wx.Button.__init__(self, parent,-1, label = "spustit process", size = (150,30), pos = (10,10) ) self.Bind(wx.EVT_BUTTON, self.onButtonClick) def onButtonClick(self, event): dlg = InfoWindow(self.parent, infotext='Vykonavam prikaz: %s' % COMMAND) WorkerThread(dlg,COMMAND) dlg.Show() class TopFrame(wx.Frame): def __init__(self, parent, id, title): wx.Frame.__init__(self, parent, id, title) panel = wx.Panel(self) button = StartButton(panel) class App(wx.App): def OnInit(self): self.main = TopFrame(None,-1,'Proces v threadu') self.main.Show() self.SetTopWindow(self.main) return True if __name__ == '__main__': application = App(1) application.MainLoop()