如何使用字典值创建变量并在Python的自定义函数中使用它们?

时间:2019-07-22 21:14:53

标签: python function dictionary variables tkinter

这是我想了解并尝试另一种方法的先前问题的扩展。变量应该由字典值命名,并且在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窗口小部件...在这里我粘贴了前几个!

0 个答案:

没有答案