Проблема с созданием кнопок с использованием tkinter

#python-3.x #tkinter

#python-3.x #tkinter

Вопрос:

Итак, я пытаюсь создать сетку изображений. Это связано с некоторыми другими вопросами, которые у меня были, но с тех пор я улучшил свой код, чтобы очистить его, но теперь я получаю ошибки при попытке загрузить пути к изображениям. Все изображения хранятся в папке с именем cardImages. Я знаю, что проблема кроется где-то в PhotoImage (), но пока не смог разобраться. Текущий вывод функции imageMaker равен: ./cardImages/red shaded circle1.gif

 from tkinter import *
import tkinter as tk
from Deck import Deck


#nCards = deckOfSETs.getNumberOfCards()
# Create for loop to create all possible card combos 
#for i in range(nCards):
    #print(deckOfSETs.getCard(i).getFileName())

root = tk.Tk()

# Init a Deck
deckOfSETs = Deck()

# Utility Function
def imageMaker(deck, cardNum, rootPath = './cardImages/'):
    cardFile = deck.getCard(cardNum).getFileName()
    print(rootPath   cardFile)
    return PhotoImage(file = rootPath   cardFile)


# Build the grid iterating over rows and columns 
nRows = 4
nCols = 3
counter = 0
for r in range(nRows):
    for c in range(nCols):
        btn = tk.Button(padx=50, pady=50, image = imageMaker(deckOfSETs, counter))
        btn.grid(row = r, column=c)
        
        counter  = 1

root.mainloop()
  

Вот результат, который я сейчас получаю
Текущий вывод

И вот пример того, каким я хочу, чтобы это был результат, который я хочу

Редактировать: я понял, что, вероятно, упустил важную информацию. У меня есть 2 класса, которые создают изображения, а затем помещают их в «колоду» и перемешивают их. Результат моей функции imageMaker таков: ./cardImages/red solid circle1.gif

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

Комментарии:

1. Можете ли вы поделиться Deck.py файлом? Это делает его работоспособным, поэтому мы можем видеть, что происходит.

2. Вам нужно сохранить ссылку на изображение для каждой кнопки.

Ответ №1:

вы создаете кнопку в цикле for , но присваиваете ей одну переменную ‘btn’. Это не очень хорошая практика измените код, как показано ниже, и проверьте

 nRows = 4
nCols = 3
counter = 0
def createButton():
    global counter
    counter =1
    return Button(root,padx=50, pady=50, image = imageMaker(deckOfSETs, counter))

buttons=[[createButton() for c in range(nCols)] for r in range(nRows) ]
for r in range(nRows):
    for c in range(nCols):
        buttons[r][c].grid(row = r, column=c)
  

но я не уверен, что это проблема