这是我想了解并尝试另一种方法的先前问题的扩展。变量应该由字典值命名,并且在Entry小部件中的更改时,还应该对每个变量调用自定义方法!
我已经按照@Henry Yik在How to create Tkinter widgets with loop and assign custom functions to each of them?中的建议进行了尝试。另外,当我改用这种字典方法时,我尝试将rn_entry_keys[key][7]
作为变量传递给def entry_method
,但是没有运气,因为这对我来说是很新的东西,我不完全理解在这个特殊的情况!
另外,我尝试(成功!)创建每个变量,为每个变量分配一个单独的自定义方法,但是问题是我在代码中有数千行,因为我有数十个不同的Entry字段,每个字段都有自己的更改时将调用自定义方法!
class EntryFrame(Frame):
def __init__(self, master=None, **kwargs):
Frame.__init__(self, **kwargs)
rn_entry_keys = {"rn_marker": ["Marker", 0, 0, 7, 1, 50, 1, "rn_marker"],
"rn_fabric": ["Fabric", 0, 2, 2, 1, 5, 3, "rn_fabric"],
"rn_type": ["Type", 2, 2, 1, 1, 3, 3, "rn_type"],
"rn_color": ["Color", 3, 2, 2, 1, 34, 3, "rn_color"],
"rn_bagno": ["Bagno", 5, 2, 1, 1, 8, 3, "rn_bagno"],
"rn_method": ["Method", 0, 4, 1, 1, 4, 5, "rn_method"]}
def entry_method(*args):
rn_entry_keys[key][7].set(rn_entry_keys[key][7].get().upper())
if varname(rn_entry_keys[key][7]) == "rn_type":
if 0 < len(rn_entry_keys[key][7].get()) < 2 and (rn_entry_keys[key][7].get().upper() == 'O' or
rn_entry_keys[key][7].get().upper() == 'A' or
rn_entry_keys[key][7].get().upper() == 'M' or
rn_entry_keys[key][7].get().upper() == 'R' or
rn_entry_keys[key][7].get().upper() == 'N'):
rn_entry_keys[key][7].set(rn_entry_keys[key][7].get().upper())
elif len(rn_entry_keys[key][7].get()) == 0:
rn_entry_keys[key][7].set(rn_entry_keys[key][7].get().upper())
else:
messagebox.showinfo("Warning",
"Type you've entered is invalid. "
"Currently we use only: 'N', 'O' 'A' as fabric types!")
rn_entry_keys[key][7].set('')
elif varname(rn_entry_keys[key][7]) == "rn_method":
if len(rn_entry_keys[key][7].get()) == 2 and (rn_entry_keys[key][7].get().upper() == 'LD' or
rn_entry_keys[key][7].get().upper() == 'LG' or
rn_entry_keys[key][7].get().upper() == 'LU'):
rn_entry_keys[key][7].set(rn_entry_keys[key][7].get().upper())
elif rn_entry_keys[key][7].get().upper() == 'LUL' and len(rn_entry_keys[key][7].get()) == 3:
rn_entry_keys[key][7].set(rn_entry_keys[key][7].get().upper())
elif len(rn_entry_keys[key][7].get()) == 1 and rn_entry_keys[key][7].get().upper() == 'L':
rn_entry_keys[key][7].set(rn_entry_keys[key][7].get().upper())
elif len(rn_entry_keys[key][7].get()) == 0:
rn_entry_keys[key][7].set('')
else:
messagebox.showinfo("Warning",
"Method you've entered is invalid. "
"Currently we use only: 'LD', 'LG' 'LUL' as spreading methods!")
rn_entry_keys[key][7].set('')
def varname(p):
for line in inspect.getframeinfo(inspect.currentframe().f_back)[3]:
m = re.search(r'\bvarname\s*\(\s*([A-Za-z_][A-Za-z0-9_]*)\s*\)', line)
if m:
return m.group(1)
for key in rn_entry_keys:
rn_entry_keys[key][7] = StringVar()
rn_entry_keys[key][7].trace_add('write', entry_method)
rn_entry_label = Label(master,
text=rn_entry_keys[key][0],
font="Calibri 9 bold",
bg="#%02x%02x%02x" % (39, 46, 46),
fg='white', width=rn_entry_keys[key][5]
).grid(column=rn_entry_keys[key][1], row=rn_entry_keys[key][2],
columnspan=rn_entry_keys[key][3], rowspan=rn_entry_keys[key][4],
padx=5, pady=5, sticky="news")
rn_entry_field = Entry(master, background="#%02x%02x%02x" % (158, 174, 179), justify="center",
textvariable=key).grid(column=rn_entry_keys[key][1], row=rn_entry_keys[key][6],
columnspan=rn_entry_keys[key][3],
rowspan=rn_entry_keys[key][4],
padx=5, pady=5, sticky="news")
我希望从对应于(在这种情况下)Entry小部件的字典值创建变量。首先应通过键入小部件upper()
进行键入,但根据我们键入的Entry小部件,应执行一些其他操作!标签和条目小部件已创建,但没有正确调用def entry_method
!
因此,如果有帮助...,我尝试修复此荒谬代码(用for循环缩短):
varmethod = StringVar(root)
def methodto_uppercase(*args):
if len(varmethod.get()) == 2 and (varmethod.get().upper() == 'LD' or
varmethod.get().upper() == 'LG' or
varmethod.get().upper() == 'LU'):
varmethod.set(varmethod.get().upper())
elif varmethod.get().upper() == 'LUL' and len(varmethod.get()) == 3:
varmethod.set(varmethod.get().upper())
elif len(varmethod.get()) == 1 and varmethod.get().upper() == 'L':
varmethod.set(varmethod.get().upper())
elif len(varmethod.get()) == 0:
varmethod.set('')
else:
messagebox.showinfo("Warning",
"Method you've entered is invalid. "
"Currently we use only: 'LD', 'LG' 'LUL' as spreading methods!")
varmethod.set('')
varmethod.trace_add('write', methodto_uppercase)
self.rnmethod_entry = Entry(self.entry_frame, background=rgbcon2((158, 174, 179)),
justify='center', textvariable=varmethod, width=4)
self.rnmethod_entry.grid(column=0, row=5, padx=5, sticky="SEW")
self.rnmethod_lbl = Label(self.entry_frame, text="METHOD", background=rgbcon2((39, 46, 46)),
foreground='white', font='Calibri 8')
self.rnmethod_lbl.grid(column=0, row=6, padx=5, sticky="NEW")
现在想象一下,我有一百多个Entry窗口小部件...在这里我粘贴了前几个!