Эффективно создать сетку в ткинтер - PullRequest
0 голосов
/ 17 марта 2019

В настоящее время я использую следующий код для создания сетки размером окна в python с использованием модуля tkinter

import tkinter as tk

class Frame():

    def __init__(self, *args, **kwargs):
        # Setup Canvas
        self.c = tk.Canvas(root, height=500, width=500, bg='white')
        self.c.pack(fill=tk.BOTH, expand=True)
        self.c.bind('<Configure>', self.createGrid)
        self.pixel_width = 20
        self.pixel_height = 20

        # Setup binds
        self.c.bind("<ButtonPress-1>", self.leftClick)

    def leftClick(self, event):
        items = self.c.find_closest(event.x, event.y)
        if items:
            rect_id = items[0]
            self.c.itemconfigure(rect_id, fill="red")

    def createGrid(self, event=None):
        for x in range(0, self.c.winfo_width()):
            for y in range(0, self.c.winfo_height()):
                x1 = (x * self.pixel_width)
                x2 = (x1 + self.pixel_width)
                y1 = (y * self.pixel_height)
                y2 = (y1 + self.pixel_height)
                self.c.create_rectangle(x1,y1,x2,y2)
        self.c.update()

root = tk.Tk()
gui = Frame(root)
root.mainloop()

Если я установлю высоту и ширину холста на что-то вроде 50, это будет загружаться довольно быстрохотя, когда размер увеличен до 500 x 500, как здесь установлено, требуется около 5 секунд, чтобы создать сетку.Я попытался создать сетку с линиями, но проблема в том, что мне нужны квадраты, так как я планирую изменить цвет выбранного квадрата.Есть ли способ сделать это более эффективным?

1 Ответ

0 голосов
/ 17 марта 2019

Я думаю, вы создали больше прямоугольников, чем вам нужно.Две следующие строки:

for x in range(0, self.c.winfo_width()):
        for y in range(0, self.c.winfo_height()):

Создаст прямоугольники 504x504 = 254016. Это будет хорошо работать, если вы уменьшите его, чтобы просто заполнить текущий экран:

def createGrid(self, event=None):
    for x in range(0, int(self.c.winfo_width()/20+1)):
        for y in range(0, int(self.c.winfo_height()/20+1)):
            x1 = (x * self.pixel_width)
            x2 = (x1 + self.pixel_width)
            y1 = (y * self.pixel_height)
            y2 = (y1 + self.pixel_height)
            self.c.create_rectangle(x1,y1,x2,y2)
    self.c.update()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...