Top.Mail.Ru
Ответы

Как в модуле tkinter создать клеточное поле (его параметры в тексте вопроса)

параметры

  • ширина и высота 1 клетки 10px

  • размер поля 45х45 клеток

  • размер окна приложения 450х450 размер не изменяемый

главное условие!

возможность дальнейшего взаимодействия с каждой клеткой


например: нажал на клетку и она закрасилась

убедительная просьба закомментировать основные моменты кода

По дате
По рейтингу
Аватар пользователя
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
 import tkinter as tk 
from typing import Tuple, Callable 
 
 
class GridField: 
    def __init__(self, master: tk.Tk, click_handler: Callable[[int, int], None]): 
        """ 
        Инициализация клеточного поля. 
 
        :param master: Главное окно tkinter 
        :param click_handler: Функция-обработчик клика по клетке 
        """ 
        self.master = master 
        self.click_handler = click_handler 
 
        # Константы 
        self.CELL_SIZE = 10 
        self.GRID_SIZE = 45 
        self.CANVAS_SIZE = self.CELL_SIZE * self.GRID_SIZE 
 
        # Создание и настройка холста 
        self.canvas = tk.Canvas( 
            master, width=self.CANVAS_SIZE, height=self.CANVAS_SIZE) 
        self.canvas.pack() 
 
        # Создание сетки 
        self._create_grid() 
 
        # Привязка обработчика событий 
        self.canvas.bind("<Button-1>", self._on_click) 
 
    def _create_grid(self) -> None: 
        """Создание сетки на холсте.""" 
        for i in range(0, self.CANVAS_SIZE + 1, self.CELL_SIZE): 
            self.canvas.create_line([(i, 0), (i, self.CANVAS_SIZE)]) 
            self.canvas.create_line([(0, i), (self.CANVAS_SIZE, i)]) 
 
    def _on_click(self, event: tk.Event) -> None: 
        """ 
        Обработчик клика по холсту. 
 
        :param event: Событие клика 
        """ 
        col, row = self._get_cell_coords(event.x, event.y) 
        self.click_handler(col, row) 
 
    def _get_cell_coords(self, x: int, y: int) -> Tuple[int, int]: 
        """ 
        Получение координат клетки по координатам клика. 
 
        :param x: Координата X клика 
        :param y: Координата Y клика 
        :return: Кортеж (столбец, строка) 
        """ 
        return x // self.CELL_SIZE, y // self.CELL_SIZE 
 
    def color_cell(self, col: int, row: int, color: str = "black") -> None: 
        """ 
        Закрашивание клетки заданным цветом. 
 
        :param col: Номер столбца 
        :param row: Номер строки 
        :param color: Цвет заливки (по умолчанию черный) 
        """ 
        x1 = col * self.CELL_SIZE 
        y1 = row * self.CELL_SIZE 
        x2 = x1 + self.CELL_SIZE 
        y2 = y1 + self.CELL_SIZE 
        self.canvas.create_rectangle(x1, y1, x2, y2, fill=color, outline="") 
 

def handle_click(col: int, row: int) -> None: 
    print(f"Клик по клетке: {col}, {row}") 
    grid_field.color_cell(col, row) 
 
 
root = tk.Tk() 
root.title("Клеточное поле") 
root.resizable(False, False) 
 
grid_field = GridField(root, handle_click) 
 
root.mainloop() 
 
Аватар пользователя
Ученик

import tkinter as tk

# Функция для изменения цвета клетки при нажатии
def toggle_cell(event):
# Получаем координаты нажатия
x, y = event.x // cell_size, event.y // cell_size
# Меняем цвет клетки
if canvas.itemcget(grid[x][y], 'fill') == 'white':
canvas.itemconfig(grid[x][y], fill='blue') # Закрашиваем в синий
else:
canvas.itemconfig(grid[x][y], fill='white') # Возвращаем в белый

# Параметры клеток и поля
cell_size = 10 # Размер одной клетки
grid_size = 45 # Размер поля (45x45 клеток)
window_size = grid_size * cell_size # Размер окна (450x450)

# Создаем главное окно
root = tk.Tk ()
root.title("Клеточное поле")
root.geometry(f"{window_size}x{window_size}") # Устанавливаем размер окна
root.resizable(False, False) # Запрещаем изменение размера окна

# Создаем холст для клеток
canvas = tk.Canvas(root, width=window_size, height=window_size)
canvas.pack()

# Создаем клеточное поле
grid = [] # Список для хранения клеток
for i in range(grid_size):
row = []
for j in range(grid_size):
# Рисуем клетку
cell = canvas.create_rectangle(
j * cell_size, i * cell_size,
(j + 1) * cell_size, (i + 1) * cell_size,
fill='white' # Начальный цвет клетки
)
row.append(cell) # Добавляем клетку в строку
grid.append(row) # Добавляем строку в сетку

# Привязываем событие нажатия мыши к функции toggle_cell
canvas.bind("<Button-1>", toggle_cell)

# Запускаем главный цикл приложения
root.mainloop()

Аватар пользователя
Ученик

что выполняет этот кусок кода?

12
 for i in range(grid_size):  
          row = []  

почему программа отрисовывает всего 1 строку клеток?



Видео по теме