如何在画布Tkinter对象上显示网格?

时间:2019-03-26 18:56:17

标签: python canvas tkinter grid window

所以我正在用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()

我的预期结果是有一块白色的画布,其垂直和水平线拉伸了画布的宽度和高度。但是我的实际结果只是一块白色的画布,上面没有线条。

1 个答案:

答案 0 :(得分:2)

在这种情况下,我不信任winfo_widthwinfo_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