2 Windows und aktivieren von Befehlen im 2. Fesnter

Fragen zu Tkinter.
Antworten
Mood
User
Beiträge: 2
Registriert: Dienstag 15. Juni 2021, 13:59

Hallo zusammen,

# ich bin neu in Tkinter und ich versuche einen einfachen Taschenrechner zu programmieren.
# damit ich mir die Aufgabe komplizierter mache, möchte ich dass der User erstmal in einem Fenster einloggt und wenn alles richtig ist öffnet ein zweites Fenster mit dem #Taschenrechner, wo der User auf die Buttons drückt und die gedrückte Nummer wird auf das Entry angezeigt. Mein Problem ist, wenn ich im zweiten Fenster auf ein Button #drücke, wird die Nummer von dem gedrückten Button nicht auf dem Entery angezeigt, obwohl ich das laut meines Wissens implementiert habe.
# Ich wäre euch dankbar, wenn ihr mir weiterhelfen, und Tipps sagen könnt :)

# LG!

# Hier ist mein Code:


from tkinter import *

window = Tk()
window.title('Log in')
window.geometry('400x200')
window.resizable(0,0)
window2 = Tk()
window2.state('withdrawn')

vartotal=StringVar()

def login():
calculator_window()

def zero():
vartotal.set('0')

def calculator_window():
window2 = Tk()
window.state('withdrawn')
window2.title('Calculator')
window2.geometry('400x400')
window2.resizable(0, 0)
window2.configure(bg='navajowhite')

nr_zero = Button(window2, text='0', fg='seagreen', font='arial,9', command=zero)
nr_zero.place(x=195, y=175, width=40)
total = Entry(window2, justify='center', textvariable=vartotal)
total.place(x=60, y=12)

bt_Login=Button(window,text='Log in', command=login, bd=6,relief='raised')
bt_Login.place(x=175,y=120)

window.mainloop()
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Man darf immer nur *ein* Tk-Objekt haben. Ein weiteres Fenster erstellst du mit Toplevel.
Mood
User
Beiträge: 2
Registriert: Dienstag 15. Juni 2021, 13:59

Achso, vielen Dank für deine Hilfe :)
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Das machst drei Fenster! Dabei darf es nur ein Tk-Objekt geben, weitere Fenster muß man als Toplevel erzeugen.
*-Importe sollte man nicht verwenden, weil nicht nachvollziehbar ist, wo welcher Name herkommt.
Man benutzt keine globalen Variablen, und alles was eine Funktion braucht, muß sie über ihre Argumente bekommen. In der Konsequenz braucht jedes nicht-triviale GUI-Programm Klassendefinitionen.
place benutzt man nicht, weil damit das Fenster bei unterschiedlichen Auflösungen unbenutzbar werden kann.

Code: Alles auswählen

import tkinter as tk
from functools import partial

def zero(vartotal):
    vartotal.set('0')

def calculator_window(window):
    window.state('withdrawn')
    vartotal = tk.StringVar(window)
    window2 = tk.Toplevel(window)
    window2.title('Calculator')
    window2.resizable(0, 0)
    window2.configure(bg='navajowhite')
    tk.Entry(window2, justify='center', textvariable=vartotal).pack()
    tk.Button(window2, text='0', fg='seagreen', font='arial,9', command=partial(zero, vartotal)).pack()
    window2.protocol("WM_DELETE_WINDOW", window.destroy)

def main():
    window = tk.Tk()
    window.title('Log in')
    window.resizable(0,0)
    tk.Button(window, text='Log in', command=partial(calculator_window, window), bd=6,relief='raised').pack(padx=20,pady=20)
    window.mainloop()

if __name__ == "__main__":
    main()
Antworten