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
ProgressBar - Tkinter vs. wxPython and PyGTK
-
- 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
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
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
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
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:
und hier meine Test-GUI:
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
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()
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()
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
-
- 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
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
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
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
-
- 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
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
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
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
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/
-
- 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
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