Seite 1 von 1

prozessbar

Verfasst: Donnerstag 18. Oktober 2007, 13:42
von mephisto23
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

Re: prozessbar

Verfasst: Donnerstag 18. Oktober 2007, 13:52
von gerold
mephisto23 hat geschrieben:prozessbar
Hallo mephisto!

Suche in der wxPython-Demo nach "Gauge".

mfg
Gerold
:-)

Verfasst: Donnerstag 18. Oktober 2007, 14:02
von mephisto23
danke werd ich machen.

Verfasst: Freitag 19. Oktober 2007, 14:58
von HarryPython
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