Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

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

Арсений Виниченко Ученик (105), открыт 4 недели назад
параметры
  • ширина и высота 1 клетки 10px
  • размер поля 45х45 клеток
  • размер окна приложения 450х450 размер не изменяемый
главное условие!
возможность дальнейшего взаимодействия с каждой клеткой

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

убедительная просьба закомментировать основные моменты кода
2 ответа
зхс чмо Ученик (158) 4 недели назад
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()
Арсений ВиниченкоУченик (105) 4 недели назад
что выполняет этот кусок кода?
 for i in range(grid_size):  
row = []
почему программа отрисовывает всего 1 строку клеток?
Татьяна Просветленный (36197) 2 недели назад
 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("", 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()
Похожие вопросы