0

I can create and place tkinter widgets and variables, simple variables, class, etc... in for loop so it's easy to read and easy to change. BUT, There is a real problem... I don't know how to replace:

def a_func():
    pass

def b_func():
    pass

func_dict = {
    "a": a_func,
    "b": b_func
    }

by:

func_dict = {}

def func_dict["a"]():
    pass

def func_dict["b"]():
    pass

This is an actual real problem (just imagine that there is 160 keys and multiple functions dictionnaries). All my time is spent on little error of copy-paste that I would avoid if I could iterate and initialize in dictionnaries ! :p And if I want to change an id, I have to change something like 10 function name each time !!!

Here is a working sample if you want to try to synthetize this :)

import tkinter as tk

def on_name_change(var):
    key = "name"
    value = var.get()
    if value == "bob":
        text = "success"
    else:
        text = "waiting for bob"
    error_dict[key]["text"] = text

def on_family_name_change(var):
    key = "family_name"
    value = var.get()
    print("yep")

def on_age_change(var):
    key = "age"
    value = var.get()
    try:
        int(value)
    except:
        text = "Waiting number"
    else:
        text = ""
    finally:
        error_dict[key]["text"] = text


text_dict = {
    "name": "Enter your name:",
    "family_name": "Enter your family name:",
    "age": "Age:"
    }

var_dict = {}
entry_dict = {}
label_dict = {}
error_dict = {}

func_dict = {
    "name": on_name_change,
    "family_name": on_family_name_change,
    "age": on_age_change
    }

app = tk.Tk()


    

for key in text_dict:
    var_dict[key] = tk.StringVar()
    label_dict[key] = tk.Label(app,text=text_dict[key])
    label_dict[key].pack()
    entry_dict[key] = tk.Entry(app, textvariable=var_dict[key])
    entry_dict[key].pack()
    error_dict[key] = tk.Label(app)
    error_dict[key].pack()

var_dict["name"].trace("w", lambda name, index, mode, x=var_dict["name"]: func_dict["name"](x))
var_dict["family_name"].trace("w", lambda name, index, mode, x=var_dict["family_name"]: func_dict["family_name"](x))
var_dict["age"].trace("w", lambda name, index, mode, x=var_dict["age"]: func_dict["age"](x))
app.mainloop()
   

Please, you are my only hope :)

0 Answers0