Kritik erwuenscht!
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
import wx
import time
from thread import start_new_thread
wx.SetDefaultPyEncoding("iso-8859-1")
class MyDialog(wx.Dialog):
def __init__(self, parent = None, id = -1, title = "Hallo"):
# Dialogfenster initialisieren
wx.Dialog.__init__(self, parent, id, title)
# Abbruchvariable vorbereiten
self.cancel = False
# Einfaches Label für Statusanzeige
statuslabel = wx.StaticText(self, -1, "Gleich tut er etwas...")
self.statuslabel = statuslabel
# Neuen Thread starten. In diesem Thread wird gearbeitet und alles
# was irgendwie an den Hauptthread übergeben wird, wird über ``wx.CallAfter``
# geleitet.
# Alles was irdengetwas mit der GUI zu tun hat, hat im Hauptthread zu bleiben.
# Deshalb wird alles, was die Anzeige verändert, per ``wx.CallAfter`` an
# den Hauptthread weitergeleitet und nicht diret in einem anderen Thread
# geändert.
start_new_thread(self.ich_tu_was, ())
def show_progressdiag(self):
# ProgressDialog anzeigen
diag = wx.ProgressDialog(
"Arbeitsmeldung", "Jetzt tu ich etwas...", 100, self)
# In einer Schleife die Progressbar bewegen.
x=1
while True:
time.sleep(0.1) #wartezeit zum nächsten balken (speed)
if x == 100: # wenn balken voll von vorne
x=1
#update balken und neuen text aus self.text im hauptthread
diag.Update(x,self.text)
# Wenn die Abbruchvariable gesetzt wurde --> Fertig
if self.cancel:
diag.Destroy()
return
x=x+1
def ich_tu_was(self):
statuslabel = self.statuslabel
time.sleep(2)
self.text="los" #text für Progressbar
# Label setzen (über Threadgrenzen hinweg -- deshalb mit CallAfter)
wx.CallAfter(statuslabel.SetLabel , "Jetzt tu ich etwas...")
wx.CallAfter(wx.YieldIfNeeded)
# Abbruchvariable auf False setzen
self.cancel = False
# Den Progressdialog im Hauptthread starten.
# (über Threadgrenzen hinweg -- deshalb mit CallAfter)
wx.CallAfter(self.show_progressdiag)
# Hier wird gearbeitet
time.sleep(4)
self.text="1/3"
time.sleep(4)
self.text="2/3"
time.sleep(4)
self.text="3/3"
time.sleep(2)
# Abbruchvariable setzen, damit der PrograssDialog endet
self.cancel = True
# Label setzen (über Threadgrenzen hinweg -- deshalb mit CallAfter)
wx.CallAfter(statuslabel.SetLabel , "Fertig!")
wx.CallAfter(wx.YieldIfNeeded)
def main():
app = wx.PySimpleApp()
diag = MyDialog()
diag.ShowModal()
if __name__ == "__main__":
main()