[问题] tkinter.entryconfig无法使用循环输入

楼主: MaJaeYun (Bonjwa)   2021-12-08 13:08:07
想要做的功能是在tkinter上面, 使用menu选单做切换
呼叫update_output后, 把一个StringVar字串更改内容
问题发生在写entryconfigure时, 循环工作跟预期的不一样
输出给更新字串的func时,只会出现最后一个
temp_var = tk.StringVar()
test_list = ['Test1','Test2','Test3']
for i in range(0,len(test_list)):
#显示选单正常显示没问题
tkmenu.add_command(label = test_list[i])
#绑定功能时永远都是输出最后一个'Test3'
tkmenu.entryconfigure(i, command = lambda: update_output(test_list[i]))
def update_output(self, str_var):
print("input var:" + str_var)
temp_var.set(str_var)
print("output var:" + temp_var.get())
return template_var
比对input var跟output var之后
确定输入的时候就是'Test 3', 不管按哪一个选项都一样
但不知道为什么,如果如下列所示不用循环,直接手动输入,完全可以正常运作
点到对的目录选项,就会吐回来对应的字串
tkmenu.entryconfigure(0, command = lambda: update_output('Test1'))
tkmenu.entryconfigure(1, command = lambda: update_output('Test2'))
tkmenu.entryconfigure(2, command = lambda: update_output('Test3'))
只能猜测是entryconfigure不能包在循环里?
因为看起来不像是制作选项时的时间问题,用一个一个输入的方式是完全正常的
是我写错, 或是有什么方法可以处理多笔目录选项的状况呢?
作者: lycantrope (阿宽)   2021-12-08 14:46:00
update_output是classmethod吗?template_var没定义
作者: s0914714 (YA)   2021-12-08 15:01:00
https://reurl.cc/Kra5Rmcommand = lambda i=i: update_output(test_list[i])
作者: lycantrope (阿宽)   2021-12-08 15:18:00
原来是lambda scope问题i要从lambda 左侧传入
作者: lohas1019 (汪汪)   2021-12-08 15:23:00
作者: lycantrope (阿宽)   2021-12-08 15:24:00
但理论上应该可以从global传入吗(?) 不太懂lambda陷阱
作者: s0914714 (YA)   2021-12-08 15:35:00
作者: lycantrope (阿宽)   2021-12-08 15:42:00
lambda没在冒号左侧定义会在`呼叫`时从global传入
作者: s0914714 (YA)   2021-12-08 15:43:00
可以从global传入没问题 看执行时global变量变成啥而以
作者: lycantrope (阿宽)   2021-12-08 15:48:00
嗯 例如 del i 就会导致i没定义 呼叫就会失败
楼主: MaJaeYun (Bonjwa)   2021-12-09 16:55:00
解决了 非常感谢两位大大的协助~

Links booklink

Contact Us: admin [ a t ] ucptt.com