Как отобразить сетку на холсте объекта tkinter? - PullRequest
0 голосов
/ 26 марта 2019

Итак, я создаю игру жизни на python и хотел бы создать сетку поверх холста, используя класс python tkinter. Заранее спасибо.

Чтобы создать сетку, я использую функцию create_line () класса canvas и перебираю функцию range (), чтобы мои линии рисовались по ширине и высоте холста, используя два отдельных цикла for один для ширины и один для высоты. Циклы, которые я получил, взяты из следующего фрагмента кода в stackoverflow: Как создать сетку на tkinter в 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 Ответ

2 голосов
/ 26 марта 2019

Я не доверяю winfo_width и winfo_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()

Результат:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...