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 :)