【发布时间】:2016-08-11 11:55:59
【问题描述】:
我是 Python 的 tkinter 模块的新手,因此我将不胜感激任何帮助,甚至解释为什么这根本不可能(如果是这样的话)。
我有一个(foo, bar, x, y) 形式的四元组列表;像这样:
TUPLE_LIST = [('Hello', 'World', 0, 0),
('Hovercraft', 'Eels', 50, 100),
etc.]
以及稍后的for 循环,它理想地将变量foo 实例化为带有文本bar 的按钮,每个按钮都具有将其各自的bar 添加到已定义的Entry 小部件的功能,然后将其放在坐标x, y:
for foo, bar, x, y in TUPLE_LIST:
exec("{0} = Button(self, text='{1}', command=lambda: self.update_text('{1}'))".format(foo, bar))
eval(name).place(x=x, y=y)
按钮位置完美,但如果我点击其中一个,我会收到以下错误:
Traceback (most recent call last):
File "...\lib\tkinter\__init__.py", line 1550, in __call__
return self.func(*args)
File "<string>", line 1, in <lambda>
NameError: name 'self' is not defined
我猜这与命令是用 lambda 定义的事实有关,因此本质上不是定义的“函数”,但我看到其他人定义了他们的按钮命令与 lambdas。那么它是否也与使用exec 有关?另外,这是update_text 的代码(如果重要的话):
def update_text(self, new_char):
old_str = self.text_box_str.get()
# Above is a StringVar() defined in __init__ and used as textvariable in Entry widget creation.
self.text_box_str.set(old_str + new_char)
任何帮助将不胜感激。提前致谢。
【问题讨论】:
标签: python lambda tkinter nameerror