简体   繁体   English

使用 tkinter 为每个按钮添加不同的图像

[英]Adding a different image for each button using tkinter

We are creating a Boggle game for school, and we want to make the interface as as nice as possible.我们正在为学校创建 Boggle 游戏,我们希望界面尽可能漂亮。 We created an icon for each letter and we want each button to have it's icon.我们为每个字母创建了一个图标,我们希望每个按钮都有它的图标。 For some reason is doesnt work, and I can't figure out why - it only designate an image for the last button (as shown in the picture).由于某种原因不起作用,我不知道为什么 - 它只为最后一个按钮指定一个图像(如图所示)。 This is my code:这是我的代码:

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()

What am I doing wrong?我究竟做错了什么? Thank you!谢谢!

Here is a little test that works for me :这是一个对我有用的小测试:

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()

I cannot test the following code since I don't have all the necessary, but it should work for you :我无法测试以下代码,因为我没有所有必需的代码,但它应该适合您:

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()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM