Ich schreibe aktuell ein recht komplexes Berechnungsprogramm für meine Abschlussarbeit (nein, nicht in Informatik, weshalb mir wohl an einigen Stellen ein "paar" Grundlagen fehlen... ). Grundsätzlich funktioniert Alles bisher ganz wunderbar! Jetzt bin ich aber auf folgendes Problem gestoßen:
Da die gesamte Berechnung, die während eines Programmdurchlaufs durchlaufen wird, einige Zeit in Anspruch nimmt, möchte ich den User über eine Progressbar über den Fortschritt informieren.
Drückt der User nach seinen Dateneingaben auf den Button zum Starten der Berechnung, wird eine Funktion (check(self)) gestartet, die der Reihe nach verschiedene Unterfunktionen aufruft, damit diese die dort definierten Berechnungen durchlaufen.
Nun habe ich die Funktion check(self) um einen Punkt erweitert. Bevor die Unterfunktionen der eigentlichen Berechnungen aufgerufen werden, wird eine weitere Funktion (ladebalken(self)) gestartet. Diese soll einen neuen Frame öffnen, auf dem dann die Progressbar plaziert werden kann.
Leider wird die Funktion check(self) erst vollständig durchlaufen und DANN erst wird der neue Frame geöffnet....allerdings benötige ich dann die Progressbar auch nicht mehr, da zu diesem Zeitpunkt die Berechnungen ja bereits zu 100% abgeschlossen sind! Ich habe jetzt schon einiges recherchiert, geändert, getan, gemacht und komme beim besten Willen nicht weiter... :K Ich wäre für jede Hilfe dankbar!
Ich vermute, dass es irgendwas mit der Funktion mainloop() zu zun hat?! Aber begründen kann ich auch das nicht, dazu fehlen mir vermutlich leider schlichtweg die Kenntnisse...
Um mein Problem zu veranschaulichen habe ich ein kleines Beispielprogramm geschrieben, in dem exakt das gleiche Problem auftritt.
Vielen vielen Dank schon jetzt für eure Hilfe!
Code: Alles auswählen
import tkinter
import time
class Berechnungsprogramm:
def __init__(self):
self.master=tkinter.Tk()
self.master.title("Berechnungsprogramm")
self.master.resizable(0,0)
self.frame1()
def frame1(self):
self.mainframe=tkinter.Frame(height=400, width=400, bg="yellow")
self.button=tkinter.Button(text="Berechnung", command=self.check)
self.label_1=tkinter.Label(text="", bg="yellow", fg="black", font=("Arial",20))
self.mainframe.pack()
self.button.place(x=4, y=370)
self.label_1.place(x=50, y=50)
self.mainframe.mainloop()
def check(self):
self.ladebalken()
time.sleep(3) # Ich möchte, dass das Programm etwas Zeit benötigt, um komplett ausgeführt werden zu können.
# Darum pausiere ich es hier an dieser Stelle. Dadurch sehe ich, dass der neue Frame mit dem
# Text "Anzeige" erst NACH Ablauf des Unterprogramms calculate erstellt wird....
# Ich verstehe leider nicht wieso, denn eigentlich wird es doch von der Funktion check() vor
# den Funktionen calculate_2() und calculat_2() aufgerufen und ausgeführt...
self.calculate_1()
self.calculate_2()
def ladebalken(self):
# Hier soll nun in meinem eigentlichen Programm ein Frame geöffnet werden und über meinem mainframe liegen.
# Auf diesem neuen Frame soll eine Progressbar über den Fortschritt der Berechnungen informieren.
# Simbolisch dafür steht hier einfach nur ein Label mit einem Text.
self.hintergrund=tkinter.Frame(master=self.mainframe, height=100, width=200, bg="black")
self.vordergrund=tkinter.Frame(master=self.hintergrund, height=96, width=196, bg="white")
self.label_2=tkinter.Label(master=self.vordergrund, text="Anzeige", font=("Arial", 14), bg="white", fg="black")
self.hintergrund.place(x=100, y=180)
self.vordergrund.place(x=2, y=2)
self.label_2.place(x=5, y=5)
def calculate_1(self):
# Hier werden jetzt einige Berechnungen durchgeführt, die ein paar
# Sekunden in Anspruch nehmen. Deshalb soll eine Progressbar über den
# Fortschritt informieren.
# Die Berechnungen sollen hier durch eine einfache (und hier sinnlose)
# Variablenzuweisung simbolisiert werden:
sinnlosaktion=0
self.label_1.config(text="Hallo Welt")
def calculate_2(self):
# Im eigentlichen Programm gibt es 10 solcher Unterfunktionen die für die Berechnung durchlaufen werden müssen.
# Ich habe jetzt hier in diesem Beispielprogramm zwei Funktionen stellvertretend niedergeschrieben.
sinnlosaktion=0
app=Berechnungsprogramm()