prozessbar

Plattformunabhängige GUIs mit wxWidgets.
Antworten
mephisto23
User
Beiträge: 18
Registriert: Montag 10. September 2007, 13:47

hi ich würde gerne eine prozessbar mit wxpython erstellen.
ich hab keine funktion für sowas gefunden deshalb hab ich mir gedacht ich mach einfach eine blaues feld und verändere die x achse des feldes mit den prozent.
ich bekomm das aber nicht hin. könnt ihr mir bitte weiterhelfen?

mfG
mephisto
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

mephisto23 hat geschrieben:prozessbar
Hallo mephisto!

Suche in der wxPython-Demo nach "Gauge".

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
mephisto23
User
Beiträge: 18
Registriert: Montag 10. September 2007, 13:47

danke werd ich machen.
HarryPython
User
Beiträge: 60
Registriert: Freitag 8. Juni 2007, 07:39

Hier mal ein einfaches Beispiel, ist aber ziemlich Sinnfrei, weil dein Programm dort stehen bleibt. :D

Code: Alles auswählen

import wx 

a = wx.App(0) 
dialog = wx.ProgressDialog("test1", "Was geht", 100000) 
dialog.Show(True) 
aktuellerwert=0

for aktuellerwert in range(100000):
    print  aktuellerwert
    dialog.Update(aktuellerwert, newmsg="NeueBeschriftung") 
dialog.Destroy() 

Hier die bessere Lösung:

Code: Alles auswählen

#!/usr/bin/env python 
# -*- coding: iso-8859-1 -*- 

import wx 
import threading 
import time 

wx.SetDefaultPyEncoding("iso-8859-1") 


class PulseProgressDialog(wx.ProgressDialog, threading.Thread): 
    
    def __init__( 
        self, title = "Meine pulsierende Progressbar", 
        message = "Bitte warten...", parent = None, style = wx.PD_APP_MODAL 
    ): 
        
        wx.ProgressDialog.__init__( 
            self, title = title, message = message, parent = parent, style = style 
        ) 
        threading.Thread.__init__(self) 
        
        self.stop_event = threading.Event() 
    
    
    def run(self): 
        """ 
        In dieser Threadprozedur läuft der zusätzliche Thread. 
        Alles was von hier aus die GUI ändert, muss über wx.CallAfter laufen. 
        """ 
        
        self.Show() 
        
        # Läuft bis das Stop-Event gesetzt wurde 
        while not self.stop_event.isSet(): 
            wx.CallAfter(self.UpdatePulse) 
            time.sleep(0.5) 
        
        self.Destroy() 
    
    
    def stop(self): 
        """ 
        Setzt das Stop-Event 
        """ 
        
        self.stop_event.set() 


class MyFrame(wx.Frame): 
    
    def __init__( 
        self, parent = None, id = -1, title = "Example", size = wx.Size(350, 220) 
    ): 
        
        wx.Frame.__init__(self, parent, id, title, size = size) 
        
        panel = wx.Panel(self) 
        
        vbox_main = wx.BoxSizer(wx.VERTICAL) 
        panel.SetSizer(vbox_main) 
        
        lab_message = wx.StaticText(panel) 
        vbox_main.Add(lab_message, 1, wx.EXPAND | wx.ALL, 10) 
        self.lab_message = lab_message 
        
        btn_start = wx.Button(panel, -1, "Start") 
        vbox_main.Add(btn_start, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 10) 
        btn_start.Bind(wx.EVT_BUTTON, self.start_counter) 
    
    
    def start_counter(self, event = None): 
        
        progressdiag = PulseProgressDialog(parent = self) 
        progressdiag.start() 
        
        # Hier wird gearbeitet. 
        # Da allerdings nicht in einem eigenen Thread gearbeitet wird, blockiert 
        # diese Prozedur unter Windows, während man den Progressdialog mit der 
        # Maus verschiebt. 
        
        
        for i in range(30): 
            print str(i) 
            
            self.lab_message.SetLabel("Neuer Wert: %i" % i) 
            self.lab_message.Refresh() 
            wx.YieldIfNeeded()            #Updatet die Prozessbar im Thread
            
            time.sleep(0.2) 
        
        progressdiag.stop() 


def main(): 
    """Testing""" 
    
    app = wx.PySimpleApp() 
    f = MyFrame() 
    f.Center() 
    f.Show() 
    app.MainLoop() 


if __name__ == "__main__": 
    main()
Viel Spass damit.

HarryPython
Antworten