0

代码:

import tkinter, os
from PIL import ImageTk, Image

def sortFileImages(files):
    black = [i for i in files if 'black' in i]
    white = [i for i in files if 'white' in i]
    pawns = [[i]*7 for i in files if 'pawn' in i]
    return black + pawns[0] + [' ']*32 + pawns[1] + white

files = sortFileImages(files=os.listdir("web/images/"))
root = tkinter.Tk()

index = 0
for r in range(8):
    for c in range(8):
        if files[index] != ' ':
            img = ImageTk.PhotoImage(Image.open('web/images/{}'.format(files[index])).resize((64,64)))
        else:
            img = ImageTk.PhotoImage(Image.new('RGB', (64,64)))
        label = tkinter.Label(root, image=img, borderwidth=8)

        # Color the grid squares
        if (r%2 == 0 and c%2 == 0) or (r%2 == 1 and c%2 == 1):
            label.configure(background='grey')
        else:
            label.configure(background='white')
        
        label.grid(row=r,column=c)
        index += 1

root.mainloop()

变量值:

files

['black-bishop.png', 'black-bishop2.png', 'black-king.png', 'black-knight.png', 'black-knight2.png', 'black-pawn.png', 'black-queen.png', 'black-rook.png', 'black-rook2.png', 'black-pawn.png', 'black-pawn.png', 'black-pawn.png', 'black-pawn.png', 'black-pawn.png', 'black-pawn.png', 'black-pawn.png', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'white-pawn.png', 'white-pawn.png', 'white-pawn.png', 'white-pawn.png', 'white-pawn.png', 'white-pawn.png', 'white-pawn.png', 'white-bishop.png', 'white-bishop2.png', 'white-king.png', 'white-knight.png', 'white-knight2.png', 'white-pawn.png', 'white-queen.png', 'white-rook.png', 'white-rook2.png']

我知道这不是正确的顺序,但我现在只想让它显示在板上。

输出:

我得到的棋盘输出

问题:

我期待在顶部 2行和底部 2 行的每个方格上获得碎片。

  1. 为什么不是这样?
  2. 还有,为什么车被黑盒子包围?我的图像没有那个框。

编辑:

使用@Boendal 答案,我得到以下信息:

有几块缺失的新板

为什么有些方块的中心有黑色方块(尤其是棋子所在的地方)?

编辑#2:

暗方块是由于图像不透明。

通过使用此处找到的信息将它们转换为透明来修复

4

1 回答 1

1

您缺少的是保留图像的参考。

label = tkinter.Label(root, image=img, borderwidth=8)
label.image=img

应该解决问题。你也可以替换你的 if

if (r%2 == 0 and c%2 == 0) or (r%2 == 1 and c%2 == 1):

if r%2 == c%2:

参考: http ://effbot.org/tkinterbook/photoimage.htm

@Edit 关于黑色背景:

如果我使用您的代码,我会得到带有黑色方块的整个电路板,但我没有图像。如果我使用以下代码(对我来说,它总是会进入 else 部分):

if files[index] != ' ':
    img = ImageTk.PhotoImage(Image.open('web/images/{}'.format(files[index])).resize((64,64)))
    label = tkinter.Label(root, image=img, borderwidth=8)
    label.image = img
else: # Always jump into else because my files is filled with ' '
    label = tkinter.Label(root, image='web/images/{}'.format("blank.png"), borderwidth=8)

有了这个,我用一个完全透明的 64x64 图像填充空白字段。它对我来说很好用,没有奇怪的尺寸,也没有黑色方块

您需要一张完全透明的 64x64 图像。用 Photoshop 或 gimp 创建一个。

关于人物后面的黑色方块,我认为人物(黑棋和塔)有问题。

于 2019-12-14T03:34:19.273 回答