[英]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()
注意在循环中添加了对update
和sleep
的调用。 在调用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.