【问题标题】:How to display a grid on a canvas tkinter object?如何在画布 tkinter 对象上显示网格?
【发布时间】:2019-03-26 18:56:17
【问题描述】:

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

我的预期结果是有一个白色画布,垂直和水平线延伸画布的宽度和高度。但我的实际结果只是一个顶部没有线条的白色画布。

【问题讨论】:

  • 您可以使用winfo_reqwidth()winfo_reqheight() 代替winfo_width()winfo_height()

标签: python canvas tkinter grid window


【解决方案1】:

我不相信 winfo_widthwinfo_height 在这种情况下给出准确的值。根据https://effbot.org/tkinterbook/widget.htm#Tkinter.Widget.winfo_height-method,如果你还没有打包/网格化/放置小部件,函数只会返回 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()

结果:

【讨论】:

  • winfo_widthwinfo_height 是值得信赖的,但仅限于它们的设计目的。在窗口实际可见之前,它的大小将是 1x1(这是记录在案的行为)。我意识到这或多或少是你所说的,但你所说的方式给人的印象是电话随机失败。它们不会失败,它们只是返回小部件的实际大小。
  • Kevin & Bryan Oakley 谢谢我的帮助 :)
  • @user2152012 请用@ ping 人,以便他们收到通知
  • @Programmer 下次会做
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多