Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Как получить имя картинки для нажатой кнопки в Python?

Софья Любинская Ученик (71), на голосовании 2 недели назад
Допустим, в цикле 4 кнопкам присваиваются изображения из массива.

for i in range(0, 4):
b=Button(fr2,image=mass_kart2[i])
b.pack(padx=10,side=LEFT)
b.bind("<Button-1>", duble)

Есть key-изображение, с которым нужно сравнить image на нажатой кнопке. Это функция duble:

def duble(event):
button = event.widget
print(button.cget('image'))
if(str(button.cget('image'))==key):
print("Победа!")
else:
print("Неудача!")

Но метод button.cget('image') возвращает только порядковый номер изображения, например, pyimage1, а key имеет вид 03.jpg. Как получить изображение нажатой кнопки в нормальном виде?
Голосование за лучший ответ
alternativeGod Гуру (4245) 1 месяц назад
В вашем случае проблема возникает из-за того, что метод cget('image') возвращает идентификатор объекта изображения (pyimage1), а не исходное имя файла или путь к изображению. Чтобы решить эту проблему, можно использовать дополнительную структуру данных для хранения ассоциации между кнопкой и именем файла изображения.

Вот исправленный код с решением:

Решение:
Используйте словарь для связи между кнопками и именами файлов изображений:

python
Копировать код
--------------------------------------------------------------------------------------------------------------------------
from tkinter import Tk, Button, PhotoImage, Frame, LEFT

# Создаем массив изображений
mass_kart2 = ["01.jpg", "02.jpg", "03.jpg", "04.jpg"]
image_objects = [] # Для хранения объектов PhotoImage
button_image_map = {} # Для связи кнопок с именами файлов

def duble(event):
button = event.widget
image_name = button_image_map[button] # Получаем имя изображения
print(f"Кнопка нажата. Изображение: {image_name}")

# Сравнение с ключом
if image_name == key:
print("Победа!")
else:
print("Неудача!")

# Создаем окно
root = Tk()
fr2 = Frame(root)
fr2.pack()

key = "03.jpg" # Это "ключевое" изображение для сравнения

# Создаем кнопки
for i in range(4):
img = PhotoImage(file=mass_kart2[i]) # Загружаем изображение
image_objects.append(img) # Сохраняем объект, чтобы он не удалился
b = Button(fr2, image=img)
b.pack(padx=10, side=LEFT)
b.bind("<Button-1>", duble)

# Связываем кнопку с именем изображения
button_image_map[b] = mass_kart2[i]

root.mainloop()
--------------------------------------------------------------------------------------------------------------------------
Объяснение кода:

Создание массива изображений:

mass_kart2 содержит пути к изображениям, которые вы хотите использовать.
Связывание кнопок с изображениями:

В словаре button_image_map каждая кнопка (b) сопоставляется с именем изображения (mass_kart2[i]).
Обработчик события duble:

Когда нажимается кнопка, срабатывает событие, и в button_image_map ищется соответствующее имя изображения для нажатой кнопки.

Сравнение с ключом:

Сравнивается имя файла, а не идентификатор объекта PhotoImage.

Вывод:
Теперь при нажатии на кнопку в print будет выводиться имя изображения (например, 03.jpg), а сравнение с ключом (key) будет работать корректно.
Софья ЛюбинскаяУченик (71) 1 месяц назад
Скопировала ваш код, вставила в новый файл и выдает ошибкуЖ
Traceback (most recent call last):
File "C:\Python\Scripts\Memo-Game\Memo02.py", line 31, in <module>
img = PhotoImage(file=mass_kart2[i]) # Загружаем изображение
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Python\Lib\tkinter\__init__.py", line 4162, in __init__
Image.__init__(self, 'photo', name, cnf, master, **kw)
File "C:\Python\Lib\tkinter\__init__.py", line 4109, in __init__
self.tk.call (('image', 'create', imgtype, name,) + options)
_tkinter.TclError: couldn't recognize data in image file "01.jpg"

Process finished with exit code 1
Софья ЛюбинскаяУченик (71) 1 месяц назад
Извините, вроде работает. в вашем коде поменяла PhotoImage на ImageTk.PhotoImage
Похожие вопросы