Seite 1 von 1

Login GUI mit tkinter

Verfasst: Sonntag 13. Mai 2018, 11:48
von Phobit
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!

Re: Login GUI mit tkinter

Verfasst: Sonntag 13. Mai 2018, 12:12
von __deets__
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.

Re: Login GUI mit tkinter

Verfasst: Sonntag 13. Mai 2018, 13:25
von Phobit
__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!

Re: Login GUI mit tkinter

Verfasst: Sonntag 13. Mai 2018, 13:27
von __deets__
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.

Re: Login GUI mit tkinter

Verfasst: Mittwoch 16. Mai 2018, 20:45
von bfm
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)

Re: Login GUI mit tkinter

Verfasst: Mittwoch 16. Mai 2018, 23:48
von __deets__
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.

Re: Antwort :: 404

Verfasst: Dienstag 23. März 2021, 12:45
von Arazhulino_2020
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

Re: Antwort :: 404

Verfasst: Dienstag 23. März 2021, 12:46
von Arazhulino_2020
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?

Re: Login GUI mit tkinter

Verfasst: Dienstag 23. März 2021, 12:53
von Dennis89
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

Re: Login GUI mit tkinter

Verfasst: Dienstag 23. März 2021, 13:24
von Sirius3
@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.