Создание доски 5х5 с использованием сетки в Tkinter - PullRequest
0 голосов
/ 18 февраля 2020

Я делаю одну из моих первых программ, используя python, tkinter и pillow.

Предполагается, что эта программа случайным образом выберет одно из четырех плиточных изображений, создаст изображение и повторите 25 раз. Создание доски 5x5 использование сетки для размещения изображений в квадрате.

Это не то, что произошло, когда я запустил свой код, хотя

Обычно генерируется один или два столбца и 4 строки и не каждая координата заполнена изображением.
И почему-то виден только угол изображения?
Кажется, что центр изображений расположен в верхнем левом углу их сетки.

Вывод может выглядеть примерно так:

X = координата, заполненная изображением

O = координата, заполненная цветом bg


XX

OX

OX


Когда я хочу, чтобы это выглядело так


XXXXX

XXXXX

XXXXX

XXXXX

XXXXX


Код, который должен Все изображения выглядят так:

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

Код, определяющий мои холсты, выглядит следующим образом
Они имеют тот же размер, что и изображения, которые я хочу на них нарисовать.


TILE_FLOWER = Canvas(win, height = 80, width = 80)
TILE_GRASS = Canvas(win, height = 80, width = 80)
TILE_STONE = Canvas(win, height = 80, width = 80)
TILE_WATER = Canvas(win, height = 80, width = 80)

И, наконец, код, определяющий изображения, выглядит следующим образом


TILE_FLOWER_IMG = PhotoImage(file = 'Path1.png')
TILE_GRASS_IMG = PhotoImage(file = 'Path2.png')
TILE_STONE_IMG = PhotoImage(file = 'Path3.png')
TILE_WATER_IMG = PhotoImage(file = 'Path4.png')

Надеюсь, то, что я написал, имеет смысл!
И я бы будь супер благодарен, если кто-то может помочь мне исправить этот беспорядок:)

1 Ответ

0 голосов
/ 19 февраля 2020

Вам необходимо создать новые Label или Canvas в каждой ячейке сетки 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:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...