棋盘棋子不会显示
chessboard pieces won't display
代码:
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']
我知道这不是正确的顺序,但我只想立即将其显示在板上。
输出:
问题:
I was expecting to get pieces on each square of the the top 2 and bottom 2 rows.
- 为什么不是这样?
- 另外为什么车被黑框包围了?我的图片没有那个框。
编辑:
使用@Boendal 回答,我得到以下信息:
Why do some squares have the black square in the center (especially
where the pieces are)?
编辑#2:
黑色方块是由于图像不透明。
已通过使用找到的信息将它们转换为透明来修复 here
您缺少的是保留图像的参考。
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
@编辑黑色背景:
如果我使用你的代码,我会得到带有黑色方块的整个板,但我没有图像。如果我使用下面的代码(对我来说它总是进入 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 创建一个。
关于人物后面的黑色方块,我认为人物(黑兵和塔)有问题。
代码:
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']
我知道这不是正确的顺序,但我只想立即将其显示在板上。
输出:
问题:
I was expecting to get pieces on each square of the the top 2 and bottom 2 rows.
- 为什么不是这样?
- 另外为什么车被黑框包围了?我的图片没有那个框。
编辑:
使用@Boendal 回答,我得到以下信息:
Why do some squares have the black square in the center (especially where the pieces are)?
编辑#2:
黑色方块是由于图像不透明。
已通过使用找到的信息将它们转换为透明来修复 here
您缺少的是保留图像的参考。
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
@编辑黑色背景:
如果我使用你的代码,我会得到带有黑色方块的整个板,但我没有图像。如果我使用下面的代码(对我来说它总是进入 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 创建一个。
关于人物后面的黑色方块,我认为人物(黑兵和塔)有问题。