/
kurzoid
/
gaugematch
Обзор
Документация
Войти
/
kurzoid
/
gaugematch
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/forms/protocol/protocol_form.py
113 строк
5 KB
kurzoid
git on
18 окт 2025, 13:47
18 окт 2025, 13:47
6fd9f9a
Код
Авторство
О чём код?
import tkinter as tk from tkinter import ttk from ..base_form import BaseForm from .blocks.header_block import HeaderBlock from .blocks.control_mi_block import ControlMIBlock from .blocks.conditions_block import ConditionsBlock from .blocks.results_block import ResultsBlock from .blocks.signature_block import SignatureBlock class ProtocolForm(BaseForm): def __init__(self, parent, controller): super().__init__(parent, controller) self._create_widgets() def _create_widgets(self): # Основной контейнер с прокруткой main_frame = ttk.Frame(self) main_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10) # Создаем Canvas и Scrollbar для прокрутки self.canvas = tk.Canvas(main_frame, borderwidth=0, highlightthickness=0) scrollbar = ttk.Scrollbar(main_frame, orient="vertical", command=self.canvas.yview) self.scrollable_frame = ttk.Frame(self.canvas) self.scrollable_frame.bind( "<Configure>", lambda e: self.canvas.configure(scrollregion=self.canvas.bbox("all")) ) # Создаем окно в canvas, которое будет растягиваться по ширине self.canvas_window = self.canvas.create_window( (0, 0), window=self.scrollable_frame, anchor="nw", tags="scrollable_frame" ) # Привязываем изменение размера canvas к обновлению ширины окна self.canvas.bind("<Configure>", self._on_canvas_configure) self.canvas.configure(yscrollcommand=scrollbar.set) # Упаковываем canvas и scrollbar self.canvas.pack(side="left", fill="both", expand=True) scrollbar.pack(side="right", fill="y") # Настраиваем scrollable_frame для заполнения по горизонтали self.scrollable_frame.columnconfigure(0, weight=1) # Создаем блоки формы self.header_block = HeaderBlock(self.scrollable_frame) self.header_block.pack(fill=tk.X, expand=True, pady=(0, 20)) self.control_mi_block = ControlMIBlock(self.scrollable_frame) self.control_mi_block.pack(fill=tk.X, expand=True, pady=(0, 10)) self.conditions_block = ConditionsBlock(self.scrollable_frame) self.conditions_block.pack(fill=tk.X, expand=True, pady=(0, 20)) self.results_block = ResultsBlock(self.scrollable_frame) self.results_block.pack(fill=tk.X, expand=True, pady=(0, 20)) # Добавляем блок подписи self.signature_block = SignatureBlock(self.scrollable_frame) self.signature_block.pack(fill=tk.X, expand=True, pady=(0, 20)) # Привязываем колесо мыши к прокрутке self.canvas.bind("<MouseWheel>", self._on_mousewheel) # Принудительно обновляем ширину после создания всех виджетов self.after(100, self._update_canvas_width) def _on_canvas_configure(self, event): """Обработчик изменения размера canvas - обновляет ширину окна""" # Устанавливаем ширину scrollable_frame равной ширине canvas self.canvas.itemconfig(self.canvas_window, width=event.width) def _update_canvas_width(self): """Принудительное обновление ширины после создания виджетов""" self.canvas.configure(scrollregion=self.canvas.bbox("all")) # Обновляем ширину окна в canvas canvas_width = self.canvas.winfo_width() if canvas_width > 1: # Проверяем, что canvas уже отрисован self.canvas.itemconfig(self.canvas_window, width=canvas_width) def _on_mousewheel(self, event): """Обработчик прокрутки колесом мыши""" self.canvas.yview_scroll(int(-1 * (event.delta / 120)), "units") # Методы для работы с данными формы def get_form_data(self): """Возвращает все данные формы""" return { 'date': self.header_block.get_date(), 'control_mi': self.control_mi_block.get_control_mi_data(), # Добавить 'conditions': self.conditions_block.get_conditions_data(), # Добавить 'measurements': self.results_block.get_measurement_data(), 'signature': self.signature_block.get_signature_data() } def set_form_data(self, data): """Устанавливает данные формы""" if 'date' in data: day, month, year = data['date'].split('.') self.header_block.set_date(day, month, year) if 'control_mi' in data: # Добавить self.control_mi_block.set_control_mi_data(data['control_mi']) if 'conditions' in data: # Добавить self.conditions_block.set_conditions_data(data['conditions']) if 'measurements' in data: self.results_block.set_measurement_data(data['measurements']) if 'signature' in data: self.signature_block.set_signature_data(data['signature'])