Прямоугольник рисования tkinter не работает должным образом - PullRequest
2 голосов
/ 12 июля 2020
WIDTH = HEIGHT = 800
DIMENSION = 8
SQ_SIZE = HEIGHT / DIMENSION
IMAGES = {}


def draw_board():
    colors = ["white", "black"]
    for r in range(DIMENSION+1):
        for c in range(DIMENSION+1):
            canvas.create_rectangle(100, 100, r * (WIDTH / DIMENSION), c * (WIDTH / DIMENSION), fill=colors[((r+c)%2)])


def load_images():
    pass


if __name__ == "__main__":
    root = Tk()
    root.resizable(False, False)
    canvas = Canvas(root, width=WIDTH, height=HEIGHT)
    draw_board()
    canvas.pack()
    root.mainloop()

цель - нарисовать шахматную доску. если я сделаю это без аргумента заполнения, он будет работать, как ожидалось, но когда я добавляю параметр заполнения, он либо полностью черный, либо белый (в зависимости от того, как я расставляю цвета в массиве цветов).

как я могу решить это без жесткого кодирования каждого квадрата?

PS: Я протестировал colors[((r+c)%2)], распечатав его, и он работает, как ожидалось

Ответы [ 2 ]

2 голосов
/ 12 июля 2020

Это мой первый ответ о переполнении стека, я думаю, вы неправильно поняли работу create_rectangle. Синтаксис:

create_canvas (startX, startY, endX, endY, outline, fill)

и ответ, который вы задали, ниже

canvas.create_rectangle(

        (r-1) * (WIDTH / DIMENSION),

        (c- 1) * (WIDTH / DIMENSION),

        r * (WIDTH / DIMENSION),

        c *(WIDTH / DIMENSION), 
        fill=colors[(r+c)%2])
2 голосов
/ 12 июля 2020

Проблема не в цвете, проблема в том, что вы рисуете каждый квадрат, начиная с 100,100. Вы добавляете белый квадрат в 100,100. Затем вы добавляете черный квадрат в 100,100, который скрывает белый квадрат. Затем вы добавляете белый квадрат, который скрывает черный квадрат, и черный квадрат, который скрывает белый квадрат, и так далее. Последний квадрат, который вы рисуете, будет белым и покрывает весь экран.

Чтобы визуализировать, что происходит, вы можете добавить периоды c обновлений в свой код. Например:

from tkinter import *
import time

WIDTH = HEIGHT = 800
DIMENSION = 8
SQ_SIZE = HEIGHT / DIMENSION
IMAGES = {}


def draw_board():
    colors = ["white", "black"]
    for r in range(DIMENSION+1):
        for c in range(DIMENSION+1):
            canvas.create_rectangle(100, 100, r * (WIDTH / DIMENSION), c * (WIDTH / DIMENSION), fill=colors[((r+c)%2)])
            root.update()
            time.sleep(.5)

if __name__ == "__main__":
    root = Tk()
    canvas = Canvas(root, width=WIDTH, height=HEIGHT, bg="bisque")
    canvas.pack()
    draw_board()
    root.mainloop()

Обратите внимание на добавление вызова к update и sleep внутри l oop. Я также набрал pack на холсте перед тем, как позвонить draw_board. Вы можете ясно видеть, что цвета чередуются, но каждый квадрат скрывает предыдущий.

Что вам нужно сделать, так это отрегулировать начальную координату x, y для каждого квадрата. Например:

for r in range(DIMENSION):
    for c in range(DIMENSION):
        x0, y0 = c*100, r*100
        x1, y1 = x0 + 100, y0 + 100
        canvas.create_rectangle(x0, y0, x1, y1, ...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...