我希望能够使用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_frame
,temp_name_label
,temp_name_entry
)
但是,如果是这样,为什么我会有多个具有正确标签文本和条目值的标签和条目?
另一个示例,没有代码说明:
我有3个标签,分别具有一个可识别的名称,如Unique command 1 Label
,Unique command 2 Label
和Unique command 3 Label
之类的文本。
我有3个条目,返回时分别打印类似Unique command 1
,Unique command 2
和Unique command 3
的内容,并且启动时每个Entry值分别为1、2和3。
结果:
每个标签具有正确的文本:Unique command 1 Label
,Unique command 2 Label
,Unique command 3 Label
每个条目在启动时都具有正确的值(1、2和3)
但是每个条目都返回“唯一命令3”
答案 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)
这通常被称为反思或内省。找出类似的问题,这些问题可以回答您要尝试做的事情: