Entry.get() Methode funktioniert nicht.

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
MozE
User
Beiträge: 3
Registriert: Sonntag 6. September 2015, 13:09

Moin Leute.
Ich habe öfter mal das Problem wenn ich mit dem tkinter Modul arbeite, das ich wenn es mehrere fenster gibt keine abfragen mehr mit.get() machen kann.
Ich habe dazu mal ein Beispiel geschrieben.
Hier der Code:

Code: Alles auswählen

import tkinter

def check():
    intake=ent1.get()
    intake2=ent2.get()
    result=intake1+intake2
    lb1["text"] = result
    new.destroy()

def second():
    ###
    global new
    new=tkinter.Toplevel(main)
    ###
    new.title("2nd window")
    #Label/Entry/Butt0n#
    lb2=tkinter.Label(new, text="Write Numbers")
    ent1=tkinter.Entry(new)
    ent2=tkinter.Entry(new)
    but2=tkinter.Button(new, text="check", command=check)
    #pack
    lb2.pack()
    ent1.pack()
    ent2.pack()
    but2.pack()
    #.get method
    name=ent1.get()
    #Loop#
    new.mainloop()
    


main=tkinter.Tk()
main.geometry("300x300")
main.title("1st")

#Label/Button#
lb1=tkinter.Label(main, text="Welcome")
but1=tkinter.Button(main, text="okey", command=second)
#pack
lb1.pack()
but1.pack()

#Loop#
main.mainloop()
Was mir als Fehlercode angezeigt wird ist folgendes:

Code: Alles auswählen

"Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\lib\tkinter\__init__.py", line 1533, in __call__
    return self.func(*args)
  File "C:\Users\Davide\Desktop\beispiel.py", line 4, in check
    intake=ent1.get()
NameError: name 'ent1' is not defined"
Wenn die Antwort sehr einfach ist tut es mir sehr leid(Programmiere noch nicht sehr lange)!
Danke!
Zuletzt geändert von MozE am Sonntag 6. September 2015, 13:59, insgesamt 4-mal geändert.
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@MozE: wie erzeugst Du die mehrere Fenster?
BlackJack

@MozE: Das hat nichts mit der Anzahl der Fenster zu tun sondern das lokale Namen inerhalb einer Funktion halt nur innerhalb des Funktionsaufrufes sichtbar sind. Das wäre sonst auch unbenutzbar denn dann müsste man sich ja in jeder Funktion neue Namen ausdenken die in keiner anderen Funktion schon verwendet werden. Also in wirklich *keiner* — auch nicht in anderen Modulen die man gar nicht selber geschrieben hat und deswegen gar nicht weiss welche Namen dort lokal in Funktionen verwendet werden.

Neben einer deutlich besseren Namensgebung solltest Du Dich mit objektorientierter Programmierung auseinandersetzen. Und kein ``global`` verwenden und auf Modulebene sowieso ausser Konstanten, Funktionen, und Klassen nichts definieren.
MozE
User
Beiträge: 3
Registriert: Sonntag 6. September 2015, 13:09

@BlackJack Danke mache ich mal :)
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@MoZe: ist klar, dass das nicht geht, denn check() kennt ja die lokalen Variablen von second() nicht.

Wichtig: nicht zweimal mainloop. werfe Zeile 29 heraus. Ein Toplevel braucht kein extra mainloop.

Dann:
- mach new nicht global in second
- definiere def check innerhalb von second - am Ende
- und den callback mit dem Button verschiebst Du evtl. nach dahinter
MozE
User
Beiträge: 3
Registriert: Sonntag 6. September 2015, 13:09

@Alfons Mittelmexer Vielen vielen Dank! Jetzt funktionierts auch!
Antworten