Progressbar mit Laufzeit Textänderung und Speedcontrol

Plattformunabhängige GUIs mit wxWidgets.
Antworten
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

Freitag 7. März 2008, 20:12

Servus ich hab mir mal erlaubt ein muster zu Gredensen

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()
Antworten