GHoeberth hat geschrieben:Hallo ...
Ich versuche gerade irgendwiein Tkinter einzusteigen...
Wie kann ich auf Elemente des Fensters aus dem Programm zugreifen?
indem Du zuerst einmal den überflüssigen Mist aufräumst.
def init?
Eine sinnlose Verwirrfunktion, die außerdem falsch ist, sie bekommt in vp_start_gui folgende Parameter übergeben: root, top
root ist klar
top ist aber kein Toplevel GUI Element sondern überhaupt kein GUI Element - ein sinnloses Objekt, das in __init__ lediglich Gui Elemente erstellte, sozusagen ist das nur eine Funktion gewesen.
top ist also etwas, mit dem man gar nichts anfangen kann.
Die Funktion init beginnt mit verwirrenden Parametern. Jetzt heißt die übergebene root plötzlich top und das übergebene sinnlose top wird zu gui. Das sinnlose top wird dann in eine globalen Variablen w gespeichert.
Danach wird eine globale Variable top_level belegt mit:
top_level = root
Und dann noch völlig überflüssig:
root = root
destroy_New_Toplevel_1?
destroy_New_Toplevel_1() kann nicht funktionieren, weil es kein tkinter GUI Objekt ist, sondern etwas Sinnloses bei dem kein destroy() geht.
destroy_window?
destroy_window: soll das Anwendungsfenster schließen, was dann das Programm beenden würde. Was soll aber diese Funktion, wenn kein Button dafür da ist? Einfach mit der Maus rechts oben im Fenster geklickt, schließt auch das Programm, also eine unnötige Funktion.
Und dann sollte der Rest klar geordnet und als Klasse implementiert werden:
Sinnvollerweise enthält eine Klasse die Definition eines Container Widgets (hier das Anwendungsfensters) nebst Erzeugen und Platzieren der Gui Elemente darin und die Rückruffunktionen am Besten als Methoden, weil sie dann schon selber das self des Containerwidgets bekommen, mit dem man dann die Wiggets im Containerwidget ansprechen kann.
Code: Alles auswählen
import tkinter as tk
class Application(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.title("New Toplevel 1")
self.Entry1 = tk.Entry(self,state=tk.DISABLED)
self.Entry1.place(relx=0.1, rely=0.17, relheight=0.17, relwidth=0.8 )
self.Button1 = tk.Button(self,text='Entsperren',command=self.entsperren)
self.Button1.place(relx=0.25, rely=0.5)
def entsperren(self):
print("Entsperren")
self.Entry1['state']=tk.NORMAL
if __name__ == '__main__':
Application().mainloop()
Man braucht also hier keine globale Variable, es genügt:
self
Das kann bei einer komplexen GUI auch anders sein. Etwa ein Blinkschalter wird an einem Ort gefertigt, eine Blinkleuchte an einem anderen Ort. Man kann dann nicht gleich imblementieren, dass dieser Blinkschalter die nämliche Blinkleuchte ansteuern soll, man kann nur die Ausgabe eines Blinksignals implementieren. Beim späteren Zusammenbau muss man dann den Schalter mit der Leuchte verkabeln, mit Hilfe eines dafür vorgesehenen Kabels in einem Kabelstrang. Man muss also doch unter Umständen zentrale Schaltstellen bzw. Schaltverbindungen haben.
Noch Fragen?