Возможно ли, что кнопка может передать себя в своей собственной команде? - PullRequest
0 голосов
/ 14 января 2019

Я создал кнопку динамически, и я хочу дать им команду изменить их изображение и изменить положение. Теперь проблема в том, что мне не удается самому передать кнопку в команде

Я обменял изображения в коде ниже с текстом, но проблема все та же.

Он не работает с лямбдой, или я не правильно его использовал.

from tkinter import *

karten = {'Stapel': [['D','A','BDA','D'],['D','2','BD2','D']]}
def p(button):
    button.config(text='HI')
RS = 'RS'
DA = 'DA'
D2 = 'D2'
root = Tk()
for i in karten:
    for j in karten[i]:
        vars()[j[2]] = Button(root,text=vars()[j[0]+j[1]],command=lambda: p(vars()[j[2]]))
        vars()[j[2]].pack()
root.mainloop()

Я ожидал, что кнопка изменит текст, но выдает только ошибку.

1 Ответ

0 голосов
/ 14 января 2019

Диктант, возвращаемый 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...