Диктант, возвращаемый vars
, отличается внутри lambda
и вне его, поэтому вы кладете свой ключ в один диктовку, а затем пытаетесь получить его из другого. Кроме того, вам, вероятно, не следует использовать vars
(или globals
или locals
), если вы можете помочь. (А для text
использование vars()
не имеет никакого смысла.)
Вместо этого вы можете просто создать специальный словарь для кнопок в глобальной области видимости и получить к нему доступ в своем lambda
. Значения не обязательно должны присутствовать в dict при создании лямбды, просто при ее вызове.
buttons = {}
for i in karten:
for j in karten[i]:
b = Button(root, text=j[0]+j[1], command=lambda j=j: p(buttons[j[2]]))
b.pack()
buttons[j[2]] = b
Также обратите внимание на j=j
в lambda
(подробное объяснение см. здесь ).
В качестве альтернативы, вы можете использовать configure
для установки command
после создания кнопки и определения переменной, таким образом, словарь вообще не нужен:
for i in karten:
for j in karten[i]:
b = Button(root, text=j[0]+j[1])
b.configure(command=lambda b=b: p(b))
b.pack()
Или используя functools.partial
вместо lambda b=b
:
b.configure(command=functools.partial(p, b))