ProgressBar - Tkinter vs. wxPython and PyGTK

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Bernd

Hallo Pythianer,

habe schon Verschiedenes unter Python implementiert und wollte jetzt
meine GUI um eine ProgressBar ergänzen. Da ich vorzugsweise mit
Tkinter arbeite bin ich jetzt ausgebremst, weil ich eine ProgressBar dort nicht finden konnte. Für Linux gibt es sie innerhalb von PyGTK, mit wxPython kenne ich mich nicht aus. Meine Frage daher : Gibt es eine plattformunabhängige ProgressBar als Standardmodul oder muß man sich so etwas selber basteln, hat das vielleicht schon jemand getan und kann mir den Quelltext überlassen?

Grüße und weiter viel Vergnügen mit der Schlange
Bernd
oenone
User
Beiträge: 75
Registriert: Mittwoch 27. August 2003, 14:39
Wohnort: 49°17'28N, 8°15'57E
Kontaktdaten:

wo hast du denn gesucht ?
in Tkinter gibt es sehr wohl eine progressbar:

http://www.esrf.fr/computing/bliss/gui/ ... ssBar.html

hier gibts auch ein beispiel fuer eine progressbar:

http://www.pythonapocrypha.com/Chapter2 ... er20.shtml

auf bald
oenone
Gast

Vielen Dank oenone (super schnell),

der zweite Link entspricht meinen Vorstellungen.
Ist Pythonwin nicht schon sehr Windows bezogen?
Ich dachte Tkinter wäre Plattform unabhängig - ist es das nicht?
Mein Ziel ist es eine plattformunabhängige GUI zu ergalten, liege ich dann
mit Tkinter falsch?

Bis dann
Bernd
oenone
User
Beiträge: 75
Registriert: Mittwoch 27. August 2003, 14:39
Wohnort: 49°17'28N, 8°15'57E
Kontaktdaten:

zumindest der zweite link ist plattformunabhaengig.
(lief auf openbsd)

auf bald
oenone
Bernd

Nochmal zu meinem ProzessBar-Problem

habe den Quelltext einwenig modifiziert, um unabhägig von der Basis 100
zu sein. Ich möcht den Fortschritt des Balken an eine Zählschleife binden,
habe aber noch Probleme mit der Anzeige. Der schöne kontinuierliche Fortschritt in der Beispielfunktion der PrgressBar bekomme ich nicht heraus - woran liegt es? Beim ersten Knopfdruck sehe ich nur ein kurzes Flackern, danach ist kein Veränderung des Balkens mehr zu sehen.

veränderte ProgressBar:

Code: Alles auswählen

import Tkinter
import time
from math import modf

class ProgressBar:

        def __init__(self, Parent, Height=10, Width=100,                   ForegroundColor=None,BackgroundColor=None,Progress=0,Base=100):
        self.Height=Height
        self.Width=Width
        self.Base=Base
        self.BarCanvas = Tkinter.Canvas(Parent,
            width=Width,height=Height,
            background=BackgroundColor,borderwidth=1,
            relief=Tkinter.SUNKEN)
        if (BackgroundColor):
            self.BarCanvas["backgroundcolor"]=BackgroundColor
        self.BarCanvas.pack(padx=5,pady=2)
        self.RectangleID=self.BarCanvas.create_rectangle(\
            0,0,0,Height)
        if (ForegroundColor==None):
            ForegroundColor="black"
        self.BarCanvas.itemconfigure(\
                self.RectangleID,fill=ForegroundColor)
        self.SetProgressPercent(Progress)[\code]

    def SetProgressPercent(self,NewLevel):
        self.Progress=NewLevel
        self.Progress=min(self.Base,self.Progress)
        self.Progress=max(0,self.Progress)        
        self.DrawProgress()

    def DrawProgress(self):
        ProgressPixel=modf((self.Progress/float(self.Base))*self.Width)
        if ProgressPixel[0]<(1/2.):
            ProgressPixel=int(ProgressPixel[1])
        else:
            ProgressPixel=int(ProgressPixel[1])+1
        self.BarCanvas.coord(self.RectangleID,0,0,ProgressPixel,self.Height)
        

    def GetProgressPercent(self):
        return self.Progress

# Simple demonstration:
def IncrememtProgress():
    OldLevel=Bar.GetProgressPercent()
    if (OldLevel>99): sys.exit()    
    Bar.SetProgressPercent(OldLevel+1)
    root.after(20,IncrememtProgress)    
root=Tkinter.Tk()
root.title("Progress bar!")
Bar=ProgressBar(root)
root.after(20,IncrememtProgress)
root.mainloop()
und hier meine Test-GUI:

Code: Alles auswählen

import Tkinter
from Tkinter import *
import ProgressBar

class Test:

    def __init__(self):
        self.root=Tkinter.Tk()
        self.i,self.R=0,0
        label=Label(self.root, text="Halli")
        label.grid(row=1, column=2)
        start=Button(self.root, text="Generate", width=27,command=lambda : self.setTextVar(label,"Hallo")) 
        start.grid(row=1, column=1)
        self.w=Frame(self.root)
        self.prog=ProgressBar.ProgressBar(self.w,)
        self.prog.Base=1000
        self.w.grid(row=2, column=1)
        self.root.mainloop()

    def setTextVar(self,label,text):
        label["text"]=text+str(self.R)
        if self.i>self.prog.Base:
            self.i=0
            self.prog.SetProgressPercent(self.i)
        for A in range(1001):
            self.i=A
            self.prog.SetProgressPercent(self.i)
        self.R+=1

t=Test()
Das Beispiel in ProgressBar ruft sicht rekursive immer wieder auf, geht das Neuzeichnen auf dem Haupfenster nur so? Wo liegt der Gedankenfehler in meiner Test-GUI? Habe schon soviel rumgeschraubt,
dass mir nichts mehr einfällt. Muß man das Ganze etwa mit Threads versuchen? Wie ist das mit dem Zugriff auf die Variable i - Wer hat Vorrange - die Zählschleife oder der Zugriff von SetProgressPercent(i) ?


Mit Dank an den Helfer
BERND
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi Bernd,

Du solltest Tkinter schon die Gelegenheit geben, die geänderte Progressbar zu zeichnen. Ein time.sleep(10) in der Forschleife, nach dem ...SetProgressPercent(...) sollte reichen.

Gruß

Dookie
Gast

Hallo Dookie,

habe ich ausprobiert - haut leider nicht hin
(ich vermute die Schleife blockiert den Zugriff auf die Variable für das
Neuzeichnen), außerdem wäre es für meine
Anwendung schlecht, da ich dann bei jedem Listendurchlauf jeweils die
festgelegte Zeit warten müßte und meine Anwendung schon langsam genug ist. Ich meine ich hatte es so auch schon probiert - ähnliches auch mit der after()-Funktion - bisher ohne Erfolg.

Hierbei möchte ich noch auf ein weiters Problem kommen, nach dem Start meines Programms über die GUI kann ich nicht mehr auf die Oberfläche zugreifen - weder der Cancel-Button läßt sich betätigen noch die minimierte Oberfläche wieder herstellen, wenn das Fenter gewechselt wurde - woran liegt das eigentlich?

Bis zum nächsten Problem
Bernd
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hallo nochmal,

ich hab nochmal mit pydoc das Tkinter durchstöbert.
ein update() in der Schleife sollte die progressbar neu zeichnen und die GUI auch auf Usereingaben reagieren lassen. Eventuell tuts auch ein update_idletasks()

Gruß

Dookie
Gast

Danke Dookie,

das war's - super.

Frage für die Zukunft :
Steht pydoc für *.__doc__ oder ist das noch etwas Anderes?
Finde ich ziemlich zäh sich so (*.__doc__ bzw. dir(*) ) durch ein Modul zu arbeiten.
Dann stöber ich doch besser auch so, bevor ich hier wieder triviale Fragen
poste.

Also vielen Dank nochmal - die GUI hat jetzt wirklich an Wert gewonnen
Bernd
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Pydoc ist ein Programm, mit dem du jede beliebige .py Datei sich selbst dokumentieren lassen kannst. Eigentlich ist es aber nur ein Modul, und das liegt irgendwo im Pythonverzeichnis. Dann kannst du es ja mal mit python pydoc -g starten, da hast du eine grafische Oberfläche. Ansosnsten gibts das gleiche auch noch mal im INet: http://web.pydoc.org/
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

pydoc ist ein Kommandozeilentool, einfach in einem Shellfenster pydoc Tkinter eingetippt und schon wird die Onlinedokumentation des Moduls Tkinter angezeigt.
Wie Milan schrieb hat pydoc auch eine graphische Oberfläche die du mit pydoc -g& aufrufen kannst. Die Ausgabe erfolgt dann im Webbrowser, den Du mit der Shellvariablen $BROWSER auch selbst einstellen kannst.


Gruß

Dookie
Antworten