ich habe ein Problem, mit der Ausführung meines Codes, was mit den Fenstern zusammenhängt, da der Code hängen bleibt. Ich habe ein Fenster (FensterResult), welches meine Daten anzeigt. Über Buttons wird eine neue Berechnung (Calculate) angestoßen und dessen Ergebnisse (Dataset) werden angezeigt. Die Berechnung greift auf ein anderes Programm zu und liest dort die selektierten Objekte aus. Das Problem: Wenn die Objekte müssen in der "richtigen Reihenfolge" selektiert werden. Da hier viel Fehlerpotenzial herrscht wollte ich die selektierten Objekte über ein kleines Fenster (FensterKnoten) anzeigen lassen mit der Möglichkeit diese zu tauschen.
Ohne die Anzeige von FensterKnoten läuft das Programm, wie es soll. Ich drücke berechnen - er berechnet und zeigt die Werte an.
Sobald ich aber ein zweites tkinter Fenster anzeigen lasse, dann bleibt er stecken. Wenn ich dann aber das andere Fenster AUCH schließe, in dem die Ergebnisse angezeigt werden, dann wird die Berechnung ausgeführt aber logischerweise nicht mehr angezeigt
Irgendwas ist da mit den mainloops falsch. Allerdings weiß ich nicht, wie man es anders/besser macht - ich weiß auch leider nicht, welche Begriffe ich da am besten bei der Suche verwende!?
Kann mir hier jemand bitte weiterhelfen?
Der Code sollte so lauffähig sein. Wenn man in der def Calculate die entsprechenden Zeilen auskommentiert, dann läuft es, nur eben ohne die Abfrage.
Gruß Tobias
Code: Alles auswählen
import tkinter as tk
class Dataset:
def __init__(self, data, root, column):
self.data = data
self.obj = []
self.root = root
self.column = column
row = 0
for x in range(0, len(self.data)-2):
label = tk.Label(self.root, text=str(round(self.data[x],2)))
label.grid(row = row, column = self.column)
row+=1
self.obj.append(label)
btn = tk.Button(self.root, text='löschen', command=self.Delete)
btn.grid(row=row, column = self.column)
self.obj.append(btn)
row += 1
def Delete(self):
for o in self.obj:
o.destroy()
class FensterResult:
def __init__(self):
self.calcs = []
self.column = 2
def Show(self):
self.root = tk.Tk()
self.root.title('Ergebnisvorschau')
#NVP Daten
rows = ["NVP", "S_K''min", "Netzimp.winkel", "UW Sammelschiene",
"S_K''max", "I_K''", "I_p", "I_a", "delta U NVP", "delta U_max Netz", "U/U_n max Netz", "E-Spulenkapazität",
"I_E abgelesen", "I_E Planung", "I_E Bestand"]
for x in range(len(rows)):
tk.Label(self.root, text=rows[x]).grid(row=x, column=1)
tk.Button(self.root, text='Neue Berechnung', command=self.Berechnung, height=1, width = 15
).grid(row=len(rows), column=1, pady=4, padx = 5)
tk.Button(self.root, text='Speichern', command=self.Speichern, height=1, width = 15
).grid(row=len(rows)+1, column=1, pady=4, padx = 5)
tk.Button(self.root, text='Beenden', command=self.Ok, height=1, width = 15
).grid(row=len(rows)+2, column=1, pady=4, padx = 5)
self.root.mainloop()
def Berechnung(self):
calc = Calculate()
if calc != 0:
dataset = Dataset(calc, self.root, self.column)
self.column += 1
self.calcs.append(dataset)
def Speichern(self):
print("save")
def Ok(self):
self.abbruch = False
self.Quit()
def Quit(self):
self.root.destroy()
class FensterKnoten:
def __init__(self, s_name, s_node_id, nvp_name, nvp_node_id):
self.s_node_id = s_node_id
self.nvp_node_id = nvp_node_id
self.s_name = s_name
self.nvp_name = nvp_name
self.switched = False
self.abbruch = True
def Show(self):
self.root = tk.Tk()
self.root.title('Auswahl')
tk.Label(self.root, text="K1:").grid(row=0, column=0, padx=4, pady=4)
tk.Label(self.root, text=self.s_name).grid(row=0, column=1, padx=4, pady=4)
tk.Label(self.root, text="K2:").grid(row=1, column=0, padx=4, pady=4)
tk.Label(self.root, text=self.nvp_name).grid(row=1, column=1, padx=4, pady=4)
tk.Button(self.root, text='berechnen', command=self.Ok).grid(row=3, column=0, padx=4, pady=4)
tk.Button(self.root, text='tauschen', command=self.Switch).grid(row=3, column=1, padx=4, pady=4)
self.root.mainloop()
def Ok(self):
self.abbruch = False
self.Quit()
def Quit(self):
self.root.destroy()
def Switch(self):
buffname = self.s_name
buffid = self.s_node_id
self.s_name = self.nvp_name
self.s_node_id = self.nvp_node_id
self.nvp_name = buffname
self.nvp_node_id = buffid
self.Quit()
self.switched = True
def Calculate():
s_node_id = 123123
nvp_node_id = 44444
s_name = "abc"
nvp_name = "blub"
#Fenster anzeigen, welches die Auswahl anzeigt zur Prüfung, ob die beiden Knoten richtig (und nicht vertauscht) angegeben worden sind
fstr = FensterKnoten(s_name, s_node_id, nvp_name, nvp_node_id)
fstr.Show()
#erneut anzeigen, wenn man die Knoten gewechselt hat oder die NAB-Anzahl falsch ist
while fstr.switched:
fstr = FensterKnoten(fstr.s_name, fstr.s_node_id, fstr.nvp_name, fstr.nvp_node_id)
fstr.Show()
if fstr.abbruch:
return 0
#Berechnungsstuff
return (123,234,345,456,57,76,6786,78,435,3453,4342,4444,5555,444,55,777,77)
if __name__ == "__main__":
fnstr = FensterResult()
fnstr.Show()