Могу ли я сделать переменную, используемую при блокировке команд, при использовании кнопок и изменении переменных

Вопрос:

Я делаю кубик Rubik с помощью Python и Tkinter, и я столкнулся с проблемой при попытке уменьшить размер моего кода.

Пиксель кода, который я показываю, предназначен для ознакомления с ситуацией Куба. Он рисует сеть куба, используя кнопки с изображениями, но у них нет фиксированных переменных, поэтому, когда я изменяю переменную, с которой они определены, переменная команды также изменяется. есть ли способ обойти это просто

#Defines Images
White = PhotoImage(file="White.gif")
Yellow = PhotoImage(file="Yellow.gif")
Blue = PhotoImage(file="Blue.gif")
Green = PhotoImage(file="Green.gif")
Red = PhotoImage(file="Red.gif")
Orange = PhotoImage(file="Orange.gif")

#List with Images, positions and values
Colours = [[White, 550, 40, 0, "White"],
[Yellow, 550, 520, 1, "Yellow"],
[Blue, 790, 280, 2, "Blue"],
[Green, 310, 280, 3, "Green"],
[Red, 550, 280, 4, "Red"],
[Orange, 70, 280, 5, "Orange"]]

#Testing Function
def swicth(a):
global Colours
print(Colours[a][4])

#Creates the Buttons in specific locations
for i in Colours:
for j in range(3):
yOffset = (j * 80) + i[2]
for k in range(3):
xOffset = (k * 80) + i[1]
Button(Solver, image = i[0], command=lambda:swicth(i[3])).place(x=xOffset, y=yOffset)

Этот код работает по большей части, но все кнопки имеют одинаковый результат 5. У меня есть способы обойтись, имея 6 наборов для циклов для шести цветов, но было бы здорово, если бы кто-нибудь мог помочь

Ответ №1

измените свою лямбду на это:

..., command=lambda arg=i[3]:swicth(arg)

Это приведет к тому, что i[3] будет привязан к лямбда в момент создания лямбда.

Оцените статью
TechArks.Ru
Добавить комментарий