Tkinter GUI Button 2tes Fenster Problem

Fragen zu Tkinter.
Antworten
AntiSchurke
User
Beiträge: 1
Registriert: Montag 10. April 2017, 14:22

Hallo Leute,
ich habe ein Problem, ich möchte eine GUI mit Python TKinter erstellen.
Soweit habe ich es geschafft.
Das Ziel der GUI ist es ein Editor, wo man sich Registrieren und Anmelden kann.
Die ist mit einer Datenbank verbunden/ soll mit einer noch verbunden werden....

Nun zum eigentlichen Problem: Ich möchte wenn ich den Registrieren Button drücke, dass sich ein zweites Fenster öffnet, wo man sich halt Registrieren kann.

Ich habe mich quer durch Google gesucht, aber trotzdem kein Glück gehabt....

Ja ich bin ein totaler Anfänger und ich bitte nicht drum mir irgendwas vorzukauen, lieber um eine gute Erklärung, womit ich lernen kann.


Vielen Dank schon mal


Gruß

AntiSchurke

Code: Alles auswählen

import sys
from tkinter import*


root = Tk()
root.title('Serj & Hoffy - Login v1.0')


root.geometry("400x205")
root.resizable(0,0)
frame = Frame(root)
frame.pack()

lblBenutzername = Label(root, text="Benutzername:")
lblBenutzername.pack()
lblBenutzername.place(x="40", y="20")

txtBenutzername = Entry(root,width="50")
txtBenutzername.pack()
txtBenutzername.place(x="42", y="45")

lblKennwort = Label(root,text="Kennwort:")
lblKennwort.pack()
lblKennwort.place(x="40", y="70")

txtKennwort = Entry(root,width="50")
txtKennwort.pack()
txtKennwort.place(x="42", y="95")

buLogin = Button(root,text="Login", height="1", width="19")
buLogin.pack()
buLogin.place(x="42", y="130")

buRegister = Button(root,text="Registrieren", height="1", width="19", command=)
buRegister.pack()
buRegister.place(x="203", y="130")

root.mainloop()
Zuletzt geändert von Anonymous am Dienstag 11. April 2017, 09:42, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@AntiSchurke: Als totaler Anfänger sollte man IMHO nicht mit GUI-Programmierung anfangen. Dazu braucht man objektorientierte Programmierung (OOP). Dafür ist halbwegs sicherer Umgang mit Funktionen Voraussetzung. Für die sollte man die Kontrollstrukturen für den Programmablauf wie bedingte Ausführung, Schleifen, und Ausnahmebehandlung können.

Das heisst wenn man mit GUI anfängt, muss man das alles auf einmal lernen plus den ereignisbasierten Ablauf den so ein GUI-Rahmenwerk zusätzlich mit sich bringt.

Zum Quelltext:

Sternchen-Importe sind Böse™. Tkinter wird üblicherweise mit ``import tkinter as tk`` importiert und die Namen aus dem Modul dann über ``tk`` referenziert. Also beispielsweise `tk.Label` statt nur `Label`.

Die Namensschreibweise entspricht nicht dem Style Guide for Python Code und man sollte keine teilweise kryptischen Präfixe wie `lbl`, `txt`, oder `bu` verwenden. Namen sollten deutlich sagen was der Wert dahinter bedeutet. Also zum Beispiel `login_button` statt dem Rätsel `buLogin`.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Keine globalen Variablen. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Man muss sich für eine Layoutmethode entscheiden. Wenn man auf einem Anzeigeelement mehr als eine aufruft, dann ”gewinnt” der letzte Aufruf, man kann sich die anderen also sparen. Bevor Du jetzt aber die `pack()`-Aufrufe entfernst: `place()` ist keine gute Idee. Absolute Grössen- und Positionsangaben für Fenster und Anzeigeelemente funktionieren oft nur auf dem Rechner wo man das ausprobiert hat oder solchen mit sehr ähnlichen Einstellungen. Bei der heutigen Vielfalt von Displaygrössen und Auflösungen ist es ziemlich wahrscheinlich das die GUI bei anderen komisch/falsch aussieht, oder sogar unbenutzbar ist, wenn sich Anzeigeelemente gegenseitig überlappen oder gar verdecken. Deine GUI sieht bei mir zum Beispiel so aus:
Bild
Zudem macht es sehr viel Aufwand wenn man auf einer GUI wo schon so einiges absolut platziert ist, irgendwo noch etwas eingefügt, entfernt, oder in der Grösse verändert werden muss, und man dadurch alles mögliche weitere anpassen und verschieben muss. Deswegen überlässt man die Anordnung und Fenstergrösse dem GUI-Rahmenwerk. Also bei Tkinter innerhalb eines Container-Widgets (Fenster oder `Frame`) `pack()` *oder* `grid()` für alle Elemente. Und bei `pack()` innerhalb des Container immer die gleiche `side`, es sei denn man weiss genau was man da macht.

`frame` wird in Deinem Programm definiert, dann aber nicht benutzt.

Auch wenn Tk eigentlich nur Zeichenketten als Datentyp kennt, würde ich auf Python-Seite Zahlen auch als Zahlen schreiben und nicht als Zeichenketten, denn Python macht da einen deutlicheren Unterschied.

Zum eigentlichen Problem: Da wo jetzt der Syntaxfehler ist, weil ein Wert fehlt, muss eine Funktion oder Methode angegeben werden, die dann ausgeführt wird wenn der Benutzer auf die „Registrieren“-Schaltfläche klickt. Und in dieser Funktion oder Methode muss dann der Code stehen der das zweite Fenster öffnet. Ich würde an der Stelle einen Dialog von `tkinter.simpledialog.SimpleDialog` ableiten, dann braucht man sich nicht um die ganzen Details kümmern selber einen modalen Dialog zu programmieren.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Zwei ganz verschiedene Fenster braucht man nicht, sondern nur entweder den einen Inhalt zeigen (login) oder den anderen (registrieren).

In Deinem Code hast Du bereits etwas, was man dafür brauchst, wovon Du aber keinen Gebrauch machst:

Code: Alles auswählen

frame = Frame(root)
Denn dann schreibst Du:

Code: Alles auswählen

lblBenutzername = Label(root, text="Benutzername:")
Stattdessen solltest Du aber die GUI Elemente auf diesem Frame platzieren:

Code: Alles auswählen

lblBenutzername = Label(frame, text="Benutzername:")
Für die Registrierung machst Du dann einen zweiten Frame, etwa:

Code: Alles auswählen

frame_register = Frame(root)
Auf diesem Frame platzierst Du dann die GUI Elemente für die Registrierung. Was Du dann aber nicht gleich tun solltest ist:

Code: Alles auswählen

frame_register.pack()
Erst wenn jemand den Button "registrieren" drückt, führst Du aus:

Code: Alles auswählen

frame.unpack()
frame_register.pack()
Antworten