python - 使用 tkinter 为每个按钮添加不同的图像
问题描述
我们正在为学校创建一个 Boggle 游戏,我们希望使界面尽可能好。我们为每个字母创建了一个图标,我们希望每个按钮都有它的图标。由于某种原因不起作用,我不知道为什么 - 它只为最后一个按钮指定一个图像(如图所示)。这是我的代码:
import tkinter as tk
import random
import os
PATH_DICT = {"A": "\icons\A.png", "B": "\icons\B.png", "C": "\icons\C.png",
"D": "\icons\D.png", "E": "\icons\E.png", "F": "\icons\F.png",
"G": "\icons\G.png", "H": "\icons\H.png", "I": "\icons\I.png",
"J": "\icons\J.png", "K": "\icons\K.png", "L": "\icons\L.png",
"M": "\icons\M.png", "N": "\icons\MN.png", "O": "\icons\O.png",
"P": "\icons\P.png", "Qu": "\icons\Qu.png", "R": "\icons\R.png",
"S": "\icons\S.png", "T": "\icons\T.png", "U": "\icons\TU.png",
"V": "\icons\J.png", "W": "\icons\W.png", "X": "\icons\X.png",
"Y": "\icons\Y.png", "Z": "\icons\Z.png"}
root = tk.Tk()
def randomize_board():
letters = [
['A', 'E', 'A', 'N', 'E', 'G'],
['A', 'H', 'S', 'P', 'C', 'O'],
['A', 'S', 'P', 'F', 'F', 'K'],
['O', 'B', 'J', 'O', 'A', 'B'],
['I', 'O', 'T', 'M', 'U', 'C'],
['R', 'Y', 'V', 'D', 'E', 'L'],
['L', 'R', 'E', 'I', 'X', 'D'],
['E', 'I', 'U', 'N', 'E', 'S'],
['W', 'N', 'G', 'E', 'E', 'H'],
['L', 'N', 'H', 'N', 'R', 'Z'],
['T', 'S', 'T', 'I', 'Y', 'D'],
['O', 'W', 'T', 'O', 'A', 'T'],
['E', 'R', 'T', 'T', 'Y', 'L'],
['T', 'O', 'E', 'S', 'S', 'I'],
['T', 'E', 'R', 'W', 'H', 'V'],
['N', 'U', 'I', 'H', 'M', 'Qu']
]
board = []
for i in range(4):
row = []
for j in range(4):
letter = random.choice(letters[i * 4 + j])
row.append(letter)
board.append(row)
return board
ls = randomize_board()
CURR_DIR = os.path.dirname(os.path.abspath(__file__))
image_lst = []
for x in range(4):
for y in range(4):
i = 0
photo1 = tk.PhotoImage(file=CURR_DIR + PATH_DICT[ls[x][y]])
btn = tk.Button(image=photo1, bg="SkyBlue", activebackground="white",
padx=20, pady=20, command=lambda x=x, y=y: getclick(x, y))
btn.grid(row=y, column=x)
i += 1
root.mainloop()
我究竟做错了什么?谢谢!
解决方案
这是一个对我有用的小测试:
import tkinter as tk
import random
from PIL import ImageTk, Image
PATH_DICT = {
"A": "icons/A.png",
"B": "icons/B.png",
"C": "icons/C.png"
}
root = tk.Tk()
def randomize_board():
letters = [
['A', 'A', 'A', 'B'],
['A', 'A', 'A', 'B'],
['A', 'A', 'A', 'B'],
['A', 'A', 'C', 'A']
]
board = []
for i in range(4):
row = []
for j in range(4):
letter = random.choice(letters[i * 4 + j])
row.append(letter)
board.append(row)
return board
# ls = randomize_board()
ls = [
['A', 'A', 'A', 'B'],
['A', 'A', 'A', 'B'],
['A', 'A', 'A', 'B'],
['A', 'A', 'C', 'A']
]
def create_img(frame, path_to_img):
width = 100
height = 140
img = Image.open(path_to_img)
img = img.resize((width,height), Image.ANTIALIAS)
photoImg = ImageTk.PhotoImage(img)
btn= tk.Button(frame, image=photoImg, width=width)
return btn
buttons_list = []
for x in range(4):
row_btns = []
for y in range(4):
row_btns.append(create_img(root, PATH_DICT[ls[x][y]]))
row_btns[y].grid(row=y, column=x)
buttons_list.append(row_btns)
root.mainloop()
我无法测试以下代码,因为我没有所有必要的东西,但它应该适合你:
import tkinter as tk
import random
from PIL import ImageTk, Image
PATH_DICT = {"A": "\icons\A.png", "B": "\icons\B.png", "C": "\icons\C.png",
"D": "\icons\D.png", "E": "\icons\E.png", "F": "\icons\F.png",
"G": "\icons\G.png", "H": "\icons\H.png", "I": "\icons\I.png",
"J": "\icons\J.png", "K": "\icons\K.png", "L": "\icons\L.png",
"M": "\icons\M.png", "N": "\icons\MN.png", "O": "\icons\O.png",
"P": "\icons\P.png", "Qu": "\icons\Qu.png", "R": "\icons\R.png",
"S": "\icons\S.png", "T": "\icons\T.png", "U": "\icons\TU.png",
"V": "\icons\J.png", "W": "\icons\W.png", "X": "\icons\X.png",
"Y": "\icons\Y.png", "Z": "\icons\Z.png"}
root = tk.Tk()
def randomize_board():
letters = [
['A', 'E', 'A', 'N', 'E', 'G'],
['A', 'H', 'S', 'P', 'C', 'O'],
['A', 'S', 'P', 'F', 'F', 'K'],
['O', 'B', 'J', 'O', 'A', 'B'],
['I', 'O', 'T', 'M', 'U', 'C'],
['R', 'Y', 'V', 'D', 'E', 'L'],
['L', 'R', 'E', 'I', 'X', 'D'],
['E', 'I', 'U', 'N', 'E', 'S'],
['W', 'N', 'G', 'E', 'E', 'H'],
['L', 'N', 'H', 'N', 'R', 'Z'],
['T', 'S', 'T', 'I', 'Y', 'D'],
['O', 'W', 'T', 'O', 'A', 'T'],
['E', 'R', 'T', 'T', 'Y', 'L'],
['T', 'O', 'E', 'S', 'S', 'I'],
['T', 'E', 'R', 'W', 'H', 'V'],
['N', 'U', 'I', 'H', 'M', 'Qu']
]
board = []
for i in range(4):
row = []
for j in range(4):
letter = random.choice(letters[i * 4 + j])
row.append(letter)
board.append(row)
return board
ls = randomize_board()
def create_img(frame, path_to_img):
width = 100
height = 140
img = Image.open(path_to_img)
img = img.resize((width,height), Image.ANTIALIAS)
photoImg = ImageTk.PhotoImage(img)
btn = tk.Button(frame, image=photoImg, bg="SkyBlue", activebackground="white",
padx=20, pady=20, command=lambda x=x, y=y: getclick(x, y))
return btn
buttons_list = []
for x in range(4):
row_btns = []
for y in range(4):
row_btns.append(create_img(root, PATH_DICT[ls[x][y]]))
row_btns[y].grid(row=y, column=x)
buttons_list.append(row_btns)
root.mainloop()
推荐阅读
- html - 我的图片和段落位置不正确
- python - hr.employee 上 odoo 上的员工人数
- google-analytics - 跨域跟踪:跟踪用户是否真正跨域
- cucumber - 空手道 + Cucumber 报告缺少被调用场景响应的文档字符串
- google-apps-script - 如何选择段落中所有带下划线的文本
- c# - 从 RazorProjectEngine 设置生成的 C# 代码的类名
- angular - 角度材料:弹出窗口:允许窗口移动到第二个监视器屏幕
- python - 如何限制pyglet中的FPS?(窗口 on_draw 事件)
- postgresql - 将智能表同步到 postgres 表?
- java - 如何使用java8创建带有文件夹和相应文件的地图