Login GUI mit tkinter

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

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!
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

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: 185
Registriert: Freitag 4. Mai 2018, 18:13

__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!
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

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: 88
Registriert: Donnerstag 14. März 2013, 09:42

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: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Arazhulino_2020
User
Beiträge: 3
Registriert: Freitag 5. Februar 2021, 09:54

Hallo,

du musst es extra schreiben, man kann es nicht zusammen schreiben:

Code: Alles auswählen

tk_1 = Entry(root, ...)
tk_2 = Entry(root, ...)

if tk_1 == 'ADMIN':

# hier code schreiben / wenn tk_1 = admin, dann

if tk_2 == 'USER':

# hier code schreiben / wenn tk_2 = user, dann
Arazhulino_2020
User
Beiträge: 3
Registriert: Freitag 5. Februar 2021, 09:54

Hallo,

du musst es extra schreiben, man kann es nicht zusammen schreiben:

Code: Alles auswählen

tk_1 = Entry(root, ...)
tk_2 = Entry(root, ...)

if tk_1 == 'ADMIN':

# hier code schreiben / wenn tk_1 = admin, dann

if tk_2 == 'USER':

# hier code schreiben / wenn tk_2 = user, dann
Lösung?
Benutzeravatar
Dennis89
User
Beiträge: 1121
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo @Arazhulino_2020

das Thema hier ist von 2018. Was auch immer du uns mitteilen willst, starte doch ein neues eigenes Thema.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@Arazhulino_2020: tk-Entry kann niemals gleich einem String sein. Und nein, der OP wollte gleichzeitig Username und Password testen, das kann man also nicht in zwei if-Abfragen aufspalten.
Antworten