如何在Python中动态创建对象?

时间:2019-10-02 08:53:00

标签: python tkinter

我希望能够使用tkinter在程序中包含多个具有唯一的Return函数的条目。

我现在拥有的是一个带有以下内容的for循环:

...
parent = Frame(self, ...)

# values is a dictionary containing a name for each Label  
# and a list of user input and a certain command

for key, value in values.items():
    temp_name_frame = Frame(parent)  
    temp_name_frame.pack(fill="none", expand="no", anchor='w')  

    temp_name_label = Label(temp_name_frame, text=key, width=30, anchor='w')  
    temp_name_label.pack(side=LEFT, anchor='w')  

    temp_name_entry = Entry(temp_name_frame, width=20)  
    temp_name_entry.pack(side=LEFT)
    temp_name_entry.insert(END, value[0])
    temp_name_entry.bind('<Return>', lambda e: send_command(value[1]))     
...

预期的结果:
当我运行程序时,预期的结果是其中包含多个框架parent的框架temp_name_frame。在每个框架中,都存在带有文本temp_name_label的标签key和具有值temp_name_entry的条目value[0],并且每个Entry在返回时都有唯一的命令value[1]

实际结果:
当我运行程序时,结果是其中包含多个框架parent的框架temp_name_frame。在每个框架中,都有一个带有文本temp_name_label的标签key和一个值为temp_name_entry的条目value[0]但是每个条目都有最后一个命令value[1]来自Return上的值字典。

我认为这是因为每个框架,标签和条目都被覆盖了,因为每个变量的名称保持不变(temp_name_frametemp_name_labeltemp_name_entry

但是,如果是这样,为什么我会有多个具有正确标签文本和条目值的标签和条目?

另一个示例,没有代码说明:
我有3个标签,分别具有一个可识别的名称,如Unique command 1 LabelUnique command 2 LabelUnique command 3 Label之类的文本。
我有3个条目,返回时分别打印类似Unique command 1Unique command 2Unique command 3的内容,并且启动时每个Entry值分别为1、2和3。

结果:
每个标签具有正确的文本:Unique command 1 LabelUnique command 2 LabelUnique command 3 Label
每个条目在启动时都具有正确的值(1、2和3)
但是每个条目都返回“唯一命令3”

2 个答案:

答案 0 :(得分:0)

您遇到了一个相当普遍的Python后期绑定问题。您可以阅读此post了解更多详细信息。

基本上,您需要在lambda函数中强制关闭,如下所示:

...

def send_command(event, string): #just a made up function
    print (string)

for key, value in values.items():
    ...
    temp_name_entry.bind('<Return>', lambda e, v=value[1]: send_command(e, v))

答案 1 :(得分:-1)

这通常被称为反思或内省。找出类似的问题,这些问题可以回答您要尝试做的事情:

Does Python Have An Equivalent to Java Class forname

Can You Use a String to Instantiate a Class in Python