Python 使用Tkinter中的网格制作5x5板

Python 使用Tkinter中的网格制作5x5板,python,tkinter,Python,Tkinter,我用python、tkinter和pillow制作了我的第一个程序 这个程序应该随机选择四个瓷砖图像中的一个,创建一个图像并重复25次 使用网格制作5x5板,将图像放置在正方形中 但这不是我运行代码时发生的情况 通常会生成一列或两列和4行,并且并非每个坐标都会填充图像。 由于某种原因,只有图像的一角可见? 图像中心似乎位于网格的左上角 输出可能如下所示 while n < 25: n = n + 1 number = random.randint(1,4) if number == 1:

我用python、tkinter和pillow制作了我的第一个程序

这个程序应该随机选择四个瓷砖图像中的一个,创建一个图像并重复25次 使用网格制作5x5板,将图像放置在正方形中

但这不是我运行代码时发生的情况

通常会生成一列或两列和4行,并且并非每个坐标都会填充图像。
由于某种原因,只有图像的一角可见?
图像中心似乎位于网格的左上角

输出可能如下所示

while n < 25:
n = n + 1
number = random.randint(1,4)

if number == 1:

    TILE_FLOWER.grid(row = x, column = y)
    TILE_FLOWER.create_image(16,16, image = TILE_FLOWER_IMG)

elif number == 2:
    TILE_GRASS.grid(row = x, column = y)
    TILE_GRASS.create_image(16,16, image = TILE_GRASS_IMG)

elif number == 3:
    TILE_STONE.grid(row = x, column = y)
    TILE_STONE.create_image(16,16, image = TILE_STONE_IMG)

elif number == 4:
    TILE_WATER.grid(row = x, column = y,)
    TILE_WATER.create_image(16,16, image = TILE_WATER_IMG)

if x == 5:
    x = 0
    y = y + 1

else:
    x = x + 1


win.mainloop()
X=用图像填充的坐标

O=用bg颜色填充的坐标


X X


当我想让它看起来像这样的时候

while n < 25:
n = n + 1
number = random.randint(1,4)

if number == 1:

    TILE_FLOWER.grid(row = x, column = y)
    TILE_FLOWER.create_image(16,16, image = TILE_FLOWER_IMG)

elif number == 2:
    TILE_GRASS.grid(row = x, column = y)
    TILE_GRASS.create_image(16,16, image = TILE_GRASS_IMG)

elif number == 3:
    TILE_STONE.grid(row = x, column = y)
    TILE_STONE.create_image(16,16, image = TILE_STONE_IMG)

elif number == 4:
    TILE_WATER.grid(row = x, column = y,)
    TILE_WATER.create_image(16,16, image = TILE_WATER_IMG)

if x == 5:
    x = 0
    y = y + 1

else:
    x = x + 1


win.mainloop()

X X X X

X X X X

X X X X

X X X X

X X X X


用于放置图像的代码如下所示

while n < 25:
n = n + 1
number = random.randint(1,4)

if number == 1:

    TILE_FLOWER.grid(row = x, column = y)
    TILE_FLOWER.create_image(16,16, image = TILE_FLOWER_IMG)

elif number == 2:
    TILE_GRASS.grid(row = x, column = y)
    TILE_GRASS.create_image(16,16, image = TILE_GRASS_IMG)

elif number == 3:
    TILE_STONE.grid(row = x, column = y)
    TILE_STONE.create_image(16,16, image = TILE_STONE_IMG)

elif number == 4:
    TILE_WATER.grid(row = x, column = y,)
    TILE_WATER.create_image(16,16, image = TILE_WATER_IMG)

if x == 5:
    x = 0
    y = y + 1

else:
    x = x + 1


win.mainloop()

最后,定义图像的代码如下所示



希望我写的有意义

如果有人能帮我解决这个问题,我将不胜感激:)

您需要在5x5网格的每个单元格中创建新的
标签或
画布

import tkinter as tk
import random

root = tk.Tk()

imagelist = [
    tk.PhotoImage(file='Path1.png'),
    tk.PhotoImage(file='Path2.png'),
    tk.PhotoImage(file='Path3.png'),
    tk.PhotoImage(file='Path4.png'),
]

for i in range(25):
    image = random.choice(imagelist)
    tk.Label(root, image=image, width=80, height=80, bg='white').grid(row=i//5, column=i%5)
    '''
    # or using Canvas
    canvas = tk.Canvas(root, width=80, height=80, bg='white')
    canvas.create_image(40, 40, image=image)
    canvas.grid(row=i//5, column=i%5)
    '''

root.mainloop()
或者使用单个
画布

canvas = tk.Canvas(root, width=400, height=400, bg='white')
canvas.pack()

for i in range(25):
    image = random.choice(imagelist)
    row = i // 5
    col = i % 5
    canvas.create_image(40+col*80, 40+row*80, image=image)

您没有为网格的每个单元格创建新画布;您正好有四个,每次再次随机选择它们时,只需将它们移动到一个新位置。是否必须使用
Canvas
来显示图像?如果没有,最好使用
标签
。另外,由于您的代码没有在
创建图像(…)
中指定
锚定
选项,因此默认设置为
中心
。这意味着
create_image()
中的给定(x,y)是图像的中心。要么设置
anchor='nw'
要么将(x,y)设置为(40,40)。@acw1668谢谢你的提示!标签工作比使用画布简单一点哈哈,现在图像居中@jasonharper说得通谢谢你!如果我想学习如何在循环的每次迭代中制作新画布(或标签),你知道我应该去哪里吗?我找了好一阵子,似乎什么也没找到。