Login GUI mit tkinter

Fragen zu Tkinter.
Antworten
Phobit
User
Beiträge: 17
Registriert: Freitag 4. Mai 2018, 18:13

Sonntag 13. Mai 2018, 11:48

Hallo,
ich versuche gerade mit Python in tkinter ein Programm zu schreiben, beidem man sich erst mit username und passwd anmelden muss. Ich bin bereits so weit, dass das Anmeldefenster auf Knopfdruck aufgeht, und mir zwei Textfelder, eines für username und eines für das passwd gibt. Wenn ich aber jetzt mich anmelde, bei mir wäre das aktuell als username "Test" und als Passwd "Admin" und dann auf den "Anmedlen" Button klicke, kommt da eine seltsame Fehlermeldeung, kann mir da jemand sagen was ich falsch mache?

Hier der code:

Code: Alles auswählen

from tkinter import *
from tkinter import messagebox

def Login():
    fenster.destroy()
    fenster2 = Tk()
    fenster2.title("Login")
    usr_label = Label(fenster2, text="Nutzername: ")
    pas_label = Label(fenster2, text="Passwort: ")
    eingabefeld1 = Entry(fenster2, bd=5, width=40)
    eingabefeld2 = Entry(fenster2, bd=5, width=40)
    usr_label.grid(row = 0, column = 0)
    pas_label.grid(row = 1, column = 0)
    eingabefeld1.grid(row = 0, column = 1)
    eingabefeld2.grid(row = 1, column = 1)
    def Anmelden():
        usr = eingabefeld1.get()
        pas = eingabefeld2.get()
        if "Test" in eingabefeld1 and "Admin" in eingabefeld2:
            messagebox.showinfo(message="Anmeldung erfolgreich!")
            fenster2.destroy()
        else:
            messagebox.showinfo(message="Anmeldung fehlgeschlagen!")
    anmelde_button = Button(fenster2, text="Anmelden", command=Anmelden)
    anmelde_button.grid(row = 2, column = 0)


fenster = Tk()
fenster.title("Test für Login")

label = Label(fenster, text="Drücke auf Login")

login_button = Button(fenster, text="Login", command=Login)


label.grid(row = 0, column = 0)
login_button.grid(row = 1, column = 0)

mainloop()
Und hier die Fehlermeldung:
Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python3.5/tkinter/__init__.py", line 1562, in __call__
return self.func(*args)
File "/home/pi/Desktop/GUITests/Login.py", line 23, in Anmelden
if "Test" in eingabefeld1 and "Admin" in eingabefeld2:
File "/usr/lib/python3.5/tkinter/__init__.py", line 1346, in cget
return self.tk.call(self._w, 'cget', '-' + key)
TypeError: Can't convert 'int' object to str implicitly



Ich habe schon vorher in anderen Programmen Strings aus Eingabefeldern abgleichen lassen, da ging alles...liegt es vllt an dem "and"?

Danke schonmal im Vorraus!
__deets__
User
Beiträge: 2696
Registriert: Mittwoch 14. Oktober 2015, 14:29

Sonntag 13. Mai 2018, 12:12

Gewöhn dir mal gleich vernünftige Namen für Variablen und Objekte an. Eingabefeld 1 -1000 wird sofort unübersichtlich. Warum nicht gleich name_feld und passwort_feld? Auch usr und pas sind viel zu kurz.

Und dein Test auf erfolgreiche Eingabe ist viel zu generös: Test kommt auch in Testballon vor, warum sollte das ein gültiges Passwort sein? Benutzt == dafür statt in.

Last but not least musst du auch mit deinen Variablen usr und pas (nochmal: schlecht benannt) vergleichen. Nicht mit den Eingabefeldern. Deren Test auf “ist enthalten” den du mit in anwirfst kracht - warum weiß ich nicht genau, weil mir nicht ganz klar ist, was Tkinter für eine Semantik da hat.
Phobit
User
Beiträge: 17
Registriert: Freitag 4. Mai 2018, 18:13

Sonntag 13. Mai 2018, 13:25

__deets__ hat geschrieben:
Sonntag 13. Mai 2018, 12:12
Gewöhn dir mal gleich vernünftige Namen für Variablen und Objekte an. Eingabefeld 1 -1000 wird sofort unübersichtlich. Warum nicht gleich name_feld und passwort_feld? Auch usr und pas sind viel zu kurz.
Das war bei mir nur für das Test Programm, im richtigen nehme ich dann andere Variablen her, ich teste blos immer alles einzeln, Angewohnheit :K
Und dein Test auf erfolgreiche Eingabe ist viel zu generös: Test kommt auch in Testballon vor, warum sollte das ein gültiges Passwort sein? Benutzt == dafür statt in.
Ach, dafür ist das == gut, danke, bin noch neu :D
So klappts auch, vielen dank für die schnelle Antwort!
__deets__
User
Beiträge: 2696
Registriert: Mittwoch 14. Oktober 2015, 14:29

Sonntag 13. Mai 2018, 13:27

Kleinteilig testen ist sehr gut. Schlechte Konventionen angewöhnen nicht, denn das bleibt auch bei größeren Sachen so. Gleich immer richtig machen senkt die Hemmschwelle später. Und schön, das es geklappt hat.
bfm
User
Beiträge: 72
Registriert: Donnerstag 14. März 2013, 09:42

Mittwoch 16. Mai 2018, 20:45

Hallo,

funktioniert der Code? Meinem Verständnis nach fehlt hier die Bindung eines StringVar an das Entry

user = tkinter.StringVar()
Eingabefeld1 = tkinter.Entry(fenster2, textvariable=user, bd=5, width=40)
__deets__
User
Beiträge: 2696
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mittwoch 16. Mai 2018, 23:48

bfm hat geschrieben:
Mittwoch 16. Mai 2018, 20:45
Hallo,

funktioniert der Code? Meinem Verständnis nach fehlt hier die Bindung eines StringVar an das Entry

user = tkinter.StringVar()
Eingabefeld1 = tkinter.Entry(fenster2, textvariable=user, bd=5, width=40)
Er holt die Eingabe per get vom Entry. Das ist jetzt nicht groß anders als per Variable. Ich persönlich würde die auch bevorzugen, aber der Funktion tut’s so keine Abbruch.
Antworten