Seite 1 von 1

ProgressBar - Tkinter vs. wxPython and PyGTK

Verfasst: Mittwoch 22. Oktober 2003, 07:57
von 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

Verfasst: Mittwoch 22. Oktober 2003, 10:09
von oenone
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

Verfasst: Mittwoch 22. Oktober 2003, 11:22
von 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

Verfasst: Mittwoch 22. Oktober 2003, 14:19
von oenone
zumindest der zweite link ist plattformunabhaengig.
(lief auf openbsd)

auf bald
oenone

weiter mit der ProgressBar

Verfasst: Sonntag 26. Oktober 2003, 20:57
von 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

Verfasst: Montag 27. Oktober 2003, 00:41
von Dookie
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

Verfasst: Montag 27. Oktober 2003, 11:49
von 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

Verfasst: Montag 27. Oktober 2003, 13:59
von Dookie
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

Verfasst: Dienstag 28. Oktober 2003, 08:16
von 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

Verfasst: Dienstag 28. Oktober 2003, 12:55
von Milan
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/

Verfasst: Dienstag 28. Oktober 2003, 15:29
von Dookie
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