[Python-de] Tkinter und Fortschritsbalken

Albert Hermeling Albert.Hermeling at t-online.de
Sam Dez 6 19:06:43 CET 2003


Guten Abend,

ich habe ein kleines Testprogramm  geschrieben das aus folgenden Klassen 
besteht:

Progress, Kapselt den Fortschritsbalken
Maingui, Kapselt die GUI
Rechne, Kapselt die Applikation
Main,	schliesslich fuehrt alle Klassen zum fertigen Programm zusammen.

Ich habe fuer dieses Testprogramm absichtlich diese Aufteilung gewaehlt weil 
das echte Programm, auf das sich meine Frage bezieht, genau so aufgebaut ist.

Drueckt man auf den Startbutton soll eine Zahl berechnet werden, diese soll 
auf der Konsole ausgegeben werden. Zugleich muss sich der Fortschritsbalken 
um ein 10. weiterbewegen.

Die Zahl wird berechnet und auf der Konsole ausgegeben. Die GUI ist aber 
wehrend der Berechnung blockiert. Der Fortschritsbalken bewegt sich nach Ende 
der Berechnung in Eins bis zum Ende.

Weis einer woran das Liegt und wie man das verhindern kann?


Beispiel:

#!/usr/bin/python
# -*- coding: iso-8859-15 -*-

import Tkinter
from Tkconstants import *
import time
import threading
import thread

class Progress:
    def __init__(self, Parent,):
        self.progress=0
        self.grundwert=10
        self.BarCanvas=Tkinter.Canvas(Parent,width=300,height=20,bo=1)
        self.BarCanvas.pack(padx=2)
        self.RectangleID=self.BarCanvas.create_rectangle(0,0,0,20)
        self.BarCanvas.itemconfigure(self.RectangleID,fill="black")
        self.BarCanvas.coords(self.RectangleID,0,0,0,20)
        
    def errechneFortschrit(self,NewLevel):
        self.progress=NewLevel
        self.progress=min(self.grundwert,self.progress)
        self.zeichneFortschrit()
        
    def zeichneFortschrit(self):
        progresspixel=(self.progress/self.grundwert)*300
        self.BarCanvas.coords(self.RectangleID,0,0,progresspixel,20)

    def ausgabeFortschrit(self):
        return self.progress

class Maingui:
    def __init__(self,master,app):
        self.app=app
        self.master=master
        self.bar=Progress(master,)
        button=Tkinter.Button(self.master, text="Start", command=self.start)
        button.pack()

    def start(self):
        c=getattr(self.app,"rechne")
        c()
    
    def fortschrit(self):
        OldLevel=self.bar.ausgabeFortschrit()
        self.bar.errechneFortschrit(OldLevel+1)

class Rechne:
    def rechne(self,):
        a=0
        while a < 10:
            a=a+1
            print a
            self.fortschrit()
            time.sleep(1)

    def fortschrit(self):
        pass

    def zeichnen(self):
        pass

class Main(Rechne):
    def __init__(self):
        self.master=Tkinter.Tk()
        self.maingui=Maingui(self.master,self)

    def run(self,):
        self.master.mainloop()

    def fortschrit(self):
        self.maingui.fortschrit()

main=Main()
main.run()

Mit freundlichen Gruessen und danke fuer eure Hilfe

Albert