Dynamische Entry Widgets

Fragen zu Tkinter.
Antworten
Beginner1995
User
Beiträge: 1
Registriert: Dienstag 18. August 2020, 18:22

Guten Abend,

für das folgende Problem finde ich einfach keine Lösung. Gegeben ist eine Tkinter-Anwendung mit 4 Entry-Widgets a,b,c,d, die folgende Bedingungen erfüllen muss:

1) In a dürfen nur Zahlen eingegeben werden und es dürfen nicht mehr als 4 Ziffern sein

2) Wenn a leer ist, kann in c keine Eingabe gemacht werden. Der Inhalt von c und d ist derselbe wie in b.

3) Wenn a nicht leer ist, kann in c eine Eingabe gemacht werden. Der Inhalt von c und d ist derselbe. Sie sind also nicht mehr mit b verknüpft.

Die derzeitige Lösung funktioniert nur teilweise. Sie ist in der Lage, die Einträge b und c zu verknüpfen und die Verknüpfung wieder zu lösen. Ich weiß jedoch nicht, wie man die 3) Bedingung implementieren soll. Hat jemand von euch eine Idee?

Code: Alles auswählen

from tkinter import *
root = Tk()
root.geometry("200x200")


def only_numeric_input(P):
    if len(P) > 0 and P.isdigit():
        # enable entry_c and unlink its content from entry_b
        entry_c.config(textvariable=var_b, state='normal')
    else:
        # disable entry_c and link its content with entry_b
        entry_c.config(textvariable=var_b, state='disabled')

    if len(P) > 4:
        return False
    # checks if entry's value is an integer or empty and returns an appropriate boolean
    if P.isdigit() or P == "":  # if a digit was entered or nothing was entered
        return True
    return False

callback = root.register(only_numeric_input)  # registers a Tcl to Python callback

var_b = StringVar()
var_c = StringVar()

Label(root, text="a").grid(row = 0, column = 0, pady = (10,0))
Label(root, text="b").grid(row = 1, column = 0)
Label(root, text="c").grid(row = 2, column = 0)
Label(root, text="d").grid(row = 3, column = 0, pady = (40,0))

entry_a = Entry(root)
entry_b = Entry(root, textvariable = var_b)
entry_c = Entry(root, textvariable = var_b, state = "disabled")
entry_d = Entry(root, textvariable = var_b)

#display entrys
entry_a.grid(row = 0, column = 1)
entry_b.grid(row = 1, column = 1)
entry_c.grid(row = 2, column = 1)
entry_d.grid(row = 3, column = 1, pady = (40,0))

entry_a.configure(validate="key", validatecommand=(callback, "%P"))  # enables validation

mainloop()
Benutzeravatar
peterpy
User
Beiträge: 188
Registriert: Donnerstag 7. März 2013, 11:35

Hallo Beginner1995,

Du benötigst einen callback_a und einen callback_b
entry_a; callback_a ruft die Funktion only_numeric_input auf.
entry_b; callback_b entkoppelt die Entrys c und d von b.

Gruss
Peter
Antworten