/
kuzminaa
/
PDM
Обзор
Документация
Войти
/
kuzminaa
/
PDM
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/layout.py
133 строки
7 KB
kuzminaa
refactor: migrate modules to src/, add logging system, add assembly workshop
29 июл 2026, 23:52
29 июл 2026, 23:52
a5323aa
Код
Авторство
О чём код?
import tkinter as tk from tkinter import ttk class DateMaskEntry(ttk.Entry): """Поле ввода с автоматической маской даты ГГГГ-ММ-ДД.""" def __init__(self, master, **kwargs): super().__init__(master, **kwargs) self.bind("<KeyRelease>", self._format_date) def _format_date(self, event): if event.keysym in ("Backspace", "Delete", "Left", "Right", "Tab"): return text = self.get() digits = "".join(c for c in text if c.isdigit()) formatted = "" if len(digits) > 0: formatted += digits[:4] if len(digits) > 4: formatted += "-" + digits[4:6] if len(digits) > 6: formatted += "-" + digits[6:8] self.delete(0, tk.END) self.insert(0, formatted[:10]) class AppLayout: """Класс вёрстки модального окна добавления нового документа.""" def __init__(self, root, app_instance): self.root = root self.app = app_instance self.root.title("Регистрация документов ЕСКД") self.root.geometry("960x810") self.create_widgets() def create_widgets(self): main_container = ttk.Frame(self.root) main_container.pack(fill="both", expand=True) left_panel = ttk.Frame(main_container) left_panel.pack(side="left", fill="both", expand=True, padx=5) right_panel = ttk.LabelFrame(main_container, text=" Превью документа ", padding=5) right_panel.pack(side="right", fill="both", padx=10, pady=5) self.lbl_preview = ttk.Label(right_panel, text="Здесь будет отображён документ", anchor="center", justify="center", background="#e1e1e1") self.lbl_preview.pack(fill="both", expand=True, ipadx=140) # Панель перелистывания листов превью f_nav = ttk.Frame(right_panel) f_nav.pack(fill="x", pady=5) self.btn_prev_page = ttk.Button(f_nav, text="◀ Назад", width=10, command=self.app.prev_page) self.btn_prev_page.pack(side="left", padx=5) self.lbl_page_counter = ttk.Label(f_nav, text="Страница: 0 / 0", anchor="center") self.lbl_page_counter.pack(side="left", fill="x", expand=True) self.btn_next_page = ttk.Button(f_nav, text="Вперед ▶", width=10, command=self.app.next_page) self.btn_next_page.pack(side="right", padx=5) # 1. Файл f_file = ttk.LabelFrame(left_panel, text=" 1. Исходный файл ", padding=10) f_file.pack(fill="x", pady=5) ttk.Button(f_file, text="Выбрать PDF", command=self.app.browse_pdf).pack(side="left", padx=5) f_file_status = ttk.Frame(f_file) f_file_status.pack(side="left", fill="x", expand=True, padx=10) self.lbl_status = ttk.Label(f_file_status, text="Файл не выбран", foreground="red") self.lbl_status.pack(anchor="w") self.lbl_md5 = ttk.Label(f_file_status, text="MD5: ---", font=("Courier", 9), foreground="gray") self.lbl_md5.pack(anchor="w", pady=(2, 0)) # 2. Данные документа f_info = ttk.LabelFrame(left_panel, text=" 2. Данные документа ", padding=10) f_info.pack(fill="x", pady=5) ttk.Label(f_info, text="Обозначение:").grid(row=0, column=0, sticky="w", pady=3) self.ent_des = ttk.Entry(f_info, width=40) self.ent_des.grid(row=0, column=1, sticky="w", pady=3) ttk.Label(f_info, text="Наименование:").grid(row=1, column=0, sticky="w", pady=3) self.ent_title = ttk.Entry(f_info, width=40) self.ent_title.grid(row=1, column=1, sticky="w", pady=3) ttk.Label(f_info, text="Имя файла:").grid(row=2, column=0, sticky="w", pady=3) self.ent_fname = tk.Entry(f_info, width=40, state="readonly", readonlybackground="#e0e0e0") self.ent_fname.grid(row=2, column=1, sticky="w", pady=3) ttk.Label(f_info, text="Путь хранения:").grid(row=3, column=0, sticky="w", pady=3) self.ent_fpath = tk.Entry(f_info, width=40, state="readonly", readonlybackground="#e0e0e0") self.ent_fpath.grid(row=3, column=1, sticky="w", pady=3) f_ver = ttk.Frame(f_info) f_ver.grid(row=4, column=0, columnspan=2, sticky="w", pady=5) ttk.Label(f_ver, text="Версия:").pack(side="left") self.ent_ver = ttk.Entry(f_ver, width=5) self.ent_ver.insert(0, "1") self.ent_ver.pack(side="left", padx=(5, 15)) ttk.Label(f_ver, text="Изм.:").pack(side="left") self.ent_chg = ttk.Entry(f_ver, width=5) self.ent_chg.insert(0, "1") self.ent_chg.pack(side="left", padx=5) # 3. Фиксированные подписи self.f_sigs = ttk.LabelFrame(left_panel, text=" 3. Обязательные подписи ", padding=10) self.f_sigs.pack(fill="x", pady=5) self.fixed_roles = { "dev": {"lbl": "Разработал:", "row": 1}, "chk": {"lbl": "Проверил:", "row": 2}, "ctl": {"lbl": "Норм. контр.:", "row": 3}, "app": {"lbl": "Утвердил:", "row": 4} } for k, info in self.fixed_roles.items(): ttk.Label(self.f_sigs, text=info["lbl"]).grid(row=info["row"], column=0, sticky="w", pady=4) cb = ttk.Combobox(self.f_sigs, width=25) cb.grid(row=info["row"], column=1, padx=5, pady=4) info["cb"] = cb ent_d = DateMaskEntry(self.f_sigs, width=15) ent_d.grid(row=info["row"], column=2, padx=5, pady=4) info["ent_d"] = ent_d # 4. Лист согласования self.f_agree = ttk.LabelFrame(left_panel, text=" 4. Лист согласования ", padding=10) self.f_agree.pack(fill="both", expand=True, pady=5) ttk.Button(self.f_agree, text="+ Добавить согласующего", command=self.app.add_agreement_row).pack(anchor="w", pady=(0, 5)) self.rows_container = ttk.Frame(self.f_agree) self.rows_container.pack(fill="both", expand=True) tk.Button(left_panel, text="СОХРАНИТЬ В БД", bg="#2e7d32", fg="white", font=("Arial", 11, "bold"), command=self.app.save).pack(fill="x", pady=10)