所以我正在用python创建生活游戏,并想使用python的tkinter类在画布上创建网格。提前致谢。
要创建网格,我使用画布类的create_line()函数,并使用range()函数进行循环,以便使用两个单独的for循环将线条绘制到画布的宽度和高度一个代表宽度,另一个代表高度。我得到的循环摘自stackoverflow上的以下代码:How to create a grid on tkinter in python? 我以为自己了解发生了什么,但我认为应该发生的事情
from tkinter import *
from random import *
window = Tk()
window.title('Game Of Life')
canvas = Canvas(window, background='white', width=800, height=600)
def create_grid(canvas):
width = canvas.winfo_width() # gets width of the canvas
height = canvas.winfo_height() # gets height of the canvas
for line in range(0, width, 1): # range(start, stop, step)
canvas.create_line([(line, 0), (line, height)], fill='black', tags='grid_line_w')
for line in range(0, height, 1):
canvas.create_line([(0, line), (width, line)], fill='black', tags='grid_line_h')
create_grid(canvas)
canvas.grid(row=0, column=0)
window.mainloop()
我的预期结果是有一块白色的画布,其垂直和水平线拉伸了画布的宽度和高度。但是我的实际结果只是一块白色的画布,上面没有线条。
答案 0 :(得分:2)
在这种情况下,我不信任winfo_width
和winfo_height
给出准确的值。根据{{3}},如果您尚未打包/网格化/放置小部件,这些函数仅返回1,即使您有,如果窗口的事件循环最近未更新,该函数仍可能返回1。您已经知道要使宽度为800,高度为600,因此也可以直接定义它们。
另一个问题是您的range
调用的step
参数为1。这意味着行之间的距离为一个像素,这将有效地将整个画布涂成黑色。我建议采取更大的步骤。
from tkinter import *
from random import *
window = Tk()
window.title('Game Of Life')
def create_grid(window):
width = 800
height = 600
canvas = Canvas(window, background='white', width=width, height=height)
for line in range(0, width, 10): # range(start, stop, step)
canvas.create_line([(line, 0), (line, height)], fill='black', tags='grid_line_w')
for line in range(0, height, 10):
canvas.create_line([(0, line), (width, line)], fill='black', tags='grid_line_h')
canvas.grid(row=0, column=0)
create_grid(window)
window.mainloop()
结果:
https://effbot.org/tkinterbook/widget.htm#Tkinter.Widget.winfo_height-method