【发布时间】:2018-08-21 01:44:40
【问题描述】:
我的程序有一个 lambda 作为循环内 tkinter 对象的命令。我希望 lambda 为函数传递一个参数,该函数将根据参数进行一些更改。
for cat in self.t_m_scope:
print(cat)
self.t_m_scopeObj[cat] = [tk.Checkbutton(self, text = cat, command = lambda: self.t_m_checkUpdate(cat)), []]
if self.t_m_scopeVars[cat][0]: self.t_m_scopeObj[cat][0].toggle()
self.t_m_scopeObj[cat][0].grid(row = 5, column = colNum, padx = (10,10), pady = (2,5), sticky = tk.W)
每当我尝试运行它时,它总是在 cat 的最后一次迭代中通过,因为 tkinter 命令中有一些奇怪的性质。相反,我希望它与定义 lambda 时的任何迭代完全匹配。我不希望参数因为在迭代后单击了检查按钮而改变。
这是 lambda 调用的函数。
def t_m_checkUpdate(self, cat):
self.t_m_scopeVars[cat][0] = not self.t_m_scopeVars[cat][0]
for subcat in range(len(self.t_m_scopeVars[cat][1])):
if self.t_m_scopeVars[cat][0] != self.t_m_scopeVars[cat][1][subcat]:
self.t_m_scopeVars[cat][1][subcat] = not self.t_m_scopeVars[cat][1][subcat]
self.t_m_scopeObj[cat][1][subcat].toggle()
作为该程序的一些上下文,我试图让一堆检查按钮打开和关闭以响应对主检查按钮的单击。我知道要切换哪些检查按钮(因为我有很多)的唯一方法是使用 lambda 将参数传递给函数。
我明白我可以使用 if/elif/else 找到当前迭代的值并传递一个字符串而不是一个变量,但我真的不想这样做,因为它只是不可扩展。
如果有帮助,我的检查按钮的文本和我要传递的参数是相同的。
是否有任何解决方法,这样我就可以保留当前的迭代,而不会让 Tkinter 出现问题?
【问题讨论】:
-
这能回答你的问题吗? Python Lambda in a loop
标签: python for-loop button tkinter lambda