繁体   English   中英

Tkinter 绘制矩形未按预期工作

[英]Tkinter draw rectangle not working as expected

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

目标是为国际象棋画一个棋盘。 如果我在没有填充参数的情况下这样做,它会按预期工作,但是当我添加填充选项时,它要么是全黑的,要么是全白的(取决于我如何在 colors 数组中排列 colors。)

如何在不对每个方块进行硬编码的情况下解决这个问题?

PS:我通过打印测试了colors[((r+c)%2)] ,它按预期工作

问题不在于颜色,问题在于您从 100,100 开始绘制每个正方形。 在 100,100 处添加一个白色方块。 然后在 100,100 添加一个黑色方块,它隐藏了白色方块。 然后添加隐藏黑色方块的白色方块,以及隐藏白色方块的黑色方块,依此类推。 你画的最后一个正方形是白色的,它覆盖了整个屏幕。

为了可视化正在发生的事情,您可以在代码中添加定期更新。 例如:

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

注意在循环中添加了对updatesleep的调用。 在调用draw_board之前,我还在 canvas 上调用了pack 您可以清楚地看到 colors 是交替的,但每个方格都隐藏了前一个方格。

您需要做的是调整每个正方形的起始 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, ...)

这是我关于堆栈溢出的第一个答案,我认为您误解了 create_rectangle 的工作原理。语法是

create_canvas(startX,startY,endX,endY,轮廓,填充)

你问的答案如下

canvas.create_rectangle(

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

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

        r * (WIDTH / DIMENSION),

        c *(WIDTH / DIMENSION), 
        fill=colors[(r+c)%2])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM