prozessbar

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

prozessbar

Beitragvon mephisto23 » Donnerstag 18. Oktober 2007, 13:42

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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: prozessbar

Beitragvon gerold » Donnerstag 18. Oktober 2007, 13:52

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

Beitragvon mephisto23 » Donnerstag 18. Oktober 2007, 14:02

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

Beitragvon HarryPython » Freitag 19. Oktober 2007, 14:58

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder