Python / tkinter: Warum ist das falsch?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

Wenn du ein Programm hast, welches deiner Meinung nach falsch agiert, wäre der erste Schritt, den aktuellen Zustand (bzw. das aktuelle Verhalten) zu beschreiben und mit dem erwarteten Verhalten zu vergleichen. So ergibt sich ein Hinweis darauf, was falsch läuft und wo man suchen kann.

Ich werde folgend nur darauf eingehen, was mir beim Betrachten des Codes direkt auffällt.

Zunächst finde ich es seltsam, dass du für die Passworteingabe noch ein weiteres Fenster öffnest. Wenn du unterschiedliche Ansichten haben möchtest, könntest du stattdessen auch zwei Frames übereinander lagern.

Dazu ein Minimalbeispiel:

from tkinter import *

root = Tk()

page_one = Frame(root)
page_two = Frame(root)

page_one.grid(row=0, column=0, sticky='news')
page_two.grid(row=0, column=0, sticky='news')

Button(page_one, text="Go to second page", command=page_two.tkraise).pack()
Button(page_two, text="Go to first page", command=page_one.tkraise).pack()

page_one.tkraise()
root.mainloop()

Das nächste, was auffällt, ist, dass du entry2 gar nicht verwendest. In button_command2 liest du erneut den Text aus dem Eingabefeld des ersten Fenster aus. Dann aber vergleichst du den Wert nicht einmal, sondern versuchst einen Vergleich zwischen Textbox-Komponente und String:

if entry1 == "admin":

Ich denke, stattdessen sollte der Text aus entry2 verwendet werden. Die Variable muss aber entweder global sein oder an button_command2 als Argument weitergereicht werden.

Methode 1 sollte dir bekannt sein, da du so schon beim ersten Textfeld verfährst. Methode 2 würde eine Änderung des command-Arguments in open_password erfordern.

b_password1 = Button(password, text="LOGIN", command=lambda:button_command2(entry2))

Ein Lambda-Ausdruck entspricht einer anonymen Funktion. Diese wird bei Klick auf den Button ausgeführt. In ihrem Körper kapselt sie den Aufruf der button_command2-Funktion, welche wiederum die zweite Textbox als Argument entgegennimmt.

Für die button_command2-Funktion ändert sich die Signatur und die ersten beiden Zeilen im Funktionskörper werden zu einer:

def button_command2(entry):
  if entry.get() == "admin":

Die Rückgaben:

return NONE

können übrigens getrost alle raus. Der Standardrückgabewert einer Funktion ist stets None. Wolltest du dies im Code explizit ausdrücken, müsste der Ordnung halber schon jeder Programmzweig korrekt bedient werden.

Beispiel:

def button_command2(entry):
  if entry.get() == "admin":
    # ...

  return None

Nach Login ist es wiederum verwirrend, dass du die Programmführung offenbar im ersten Fenster wieder fortsetzt. Davon bekommt der Nutzer aber nichts mit, denn er hat doch gerade noch das Loginfenster im Fokus. Ich denke, du solltest dir noch einmal Gedanken über die Programmnavigation machen, bevor du versuchst, sie mit tkinter umzusetzen.


jakob960198 
Fragesteller
 26.07.2021, 09:06
Das nächste, was auffällt, ist, dass du  entry2 gar nicht verwendest.

Äh UPS kann passieren...

Nach Login ist es wiederum verwirrend, dass du die Programmführung offenbar im ersten Fenster wieder fortsetzt. Davon bekommt der Nutzer aber nichts mit, denn er hat doch gerade noch das Loginfenster im Fokus. Ich denke, du solltest dir noch einmal Gedanken über die Programmnavigation machen, bevor du versuchst, sie mit tkinter umzusetzen.

Ich wollte jetzt nicht noch ein Fenster erstellen ich fange mit tkinter an und das sollte ein test Versuch sein vielleicht kommt das noch in ein anderes Programm mal gucken.

0