Загрузка данных
# =================================================================
# dukora/modules/project/project_window_2.py (Чистая версия для секции графиков)
# =================================================================
import customtkinter as ctk
import tkinter as tk
from tkinter import ttk
import datetime
import sys
from pathlib import Path
sys.path.append(str(Path(__file__).resolve().parents[3]))
def build_charts_interface(parent_frame, window_context):
# --- Очистка ---
for widget in parent_frame.winfo_children():
widget.destroy()
# --- Переменные ---
var_group = ctk.StringVar(value="Все группы")
var_date_from = ctk.StringVar(value=datetime.datetime.now().strftime('%d.%m.%Y'))
var_period = ctk.IntVar(value=1) # Исправлено: По умолчанию 1 день
var_chart_type = ctk.StringVar(value="Гистограмма")
try:
from modules.project.project_event_logic import ProjectEventLogic
logic = ProjectEventLogic(window_context.manager_db)
except Exception:
logic = None
# === Блок 1: Группа + Кнопки ===
grp_f = ctk.CTkFrame(parent_frame, fg_color="transparent", height=50)
grp_f.pack(fill="x", pady=(0, 5), padx=5)
grp_f.grid_columnconfigure(1, weight=1)
lbl_g = ctk.CTkLabel(grp_f, text="Группа:", anchor="w", width=80)
lbl_g.pack(side="left", padx=(0, 5))
cmb_group = ctk.CTkComboBox(
grp_f,
state="readonly",
width=200,
variable=var_group
)
cmb_group.pack(side="left", expand=True, fill="x", padx=5)
btn_add = ctk.CTkButton(grp_f, text="Добавить в список", fg_color="#3B82F6", command=lambda: _add_to_list(listbox_groups_ref, var_group.get(), window_context))
btn_add.pack(side="right", padx=5)
# Листбокс групп
list_frame = ctk.CTkFrame(parent_frame)
list_frame.pack(fill="both", expand=True, pady=(5, 15), padx=5)
listbox_groups_ref = tk.Listbox(list_frame, height=4, selectmode="browse")
listbox_groups_ref.pack(side="left", fill="both", expand=True, padx=(0, 5))
scrollbar = ctk.CTkScrollbar(list_frame, orientation="vertical", command=listbox_groups_ref.yview)
scrollbar.pack(side="right", fill="y")
listbox_groups_ref.config(yscrollcommand=scrollbar.set)
# === Блок 2: Дата ===
date_f = ctk.CTkFrame(parent_frame, fg_color="transparent", height=40)
date_f.pack(fill="x", pady=5, padx=5)
lbl_d = ctk.CTkLabel(date_f, text="Дата начала:", anchor="w", width=80)
lbl_d.pack(side="left", padx=(0, 5))
try:
from tkcalendar import DateEntry
de = DateEntry(
master=date_f, width=12,
background='darkblue', foreground='white', bordercolor='gray',
headersbackground='darkgray', normalbackground='white', normalforeground='black',
weekendbackground='lightblue', weekendforeground='red', date_pattern='dd.MM.yyyy',
textvariable=var_date_from
)
today = datetime.datetime.now()
de.set_date(today)
de.pack(side="left", padx=5)
except ImportError:
e_entry = ctk.CTkEntry(date_f, placeholder_text="ДД.ММ.ГГГГ", width=120, textvariable=var_date_from)
e_entry.insert(0, datetime.datetime.now().strftime('%d.%m.%Y'))
e_entry.pack(side="left", padx=5)
# === Блок 3: Периодичность ===
per_f = ctk.CTkFrame(parent_frame, fg_color="transparent", height=40)
per_f.pack(fill="x", pady=5, padx=5)
lbl_p = ctk.CTkLabel(per_f, text="Шаг (дней):", anchor="w", width=80)
lbl_p.pack(side="left", padx=(0, 10))
ent_p = ctk.CTkEntry(per_f, width=60, justify="center", textvariable=var_period)
ent_p.pack(side="left", padx=5)
hint = ctk.CTkLabel(per_f, text="(ось X)", text_color="#A9A9A9")
hint.pack(side="left")
# === Блок 4: Тип диаграммы ===
type_f = ctk.CTkFrame(parent_frame, fg_color="transparent", height=40)
type_f.pack(fill="x", pady=5, padx=5)
lbl_t = ctk.CTkLabel(type_f, text="Тип:", anchor="w", width=80)
lbl_t.pack(side="left")
ctk.CTkComboBox(type_f, values=["Гистограмма", "График"], state="readonly", width=150, variable=var_chart_type).pack(side="left", padx=5)
# === НИЖНИЕ КНОПКИ ===
action_f = ctk.CTkFrame(parent_frame)
action_f.pack(fill="x", pady=(20, 0), padx=5)
for i in range(2): action_f.grid_columnconfigure(i, weight=1)
def reset_all_filters():
var_group.set("Все группы")
window_context.var_date_from.set(datetime.datetime.now().strftime('%d.%m.%Y'))
var_period.set(1) # Сброс тоже на 1
window_context.var_chart_type.set("Гистограмма")
if hasattr(window_context, 'listbox_groups'):
window_context.listbox_groups.delete(0, tk.END)
def add_current_selection():
selected = var_group.get()
if selected and selected != "Все группы":
current_items = listbox_groups_ref.get(0, tk.END)
if selected not in current_items:
listbox_groups_ref.insert(tk.END, selected)
def remove_selected_item():
sel = listbox_groups_ref.curselection()
if sel:
listbox_groups_ref.delete(sel[0])
btn_reset = ctk.CTkButton(action_f, text="Сбросить настройки", fg_color="#EF4444", command=reset_all_filters)
btn_reset.pack(side="left", expand=True, fill="x", padx=5)
btn_build = ctk.CTkButton(action_f, text="Построить диаграмму", fg_color="#3B82F6", command=lambda: print("[BUILD] Logic pending..."))
btn_build.pack(side="right", expand=True, fill="x", padx=5)
# Сохранение ссылок
window_context.btn_reset_section = btn_reset
window_context.btn_build_section = btn_build
window_context.listbox_groups = listbox_groups_ref
window_context.var_group = var_group
window_context.var_date_from = var_date_from
window_context.var_period_str = var_period
window_context.var_chart_type = var_chart_type
# Заполнение комбобокса данными из БД
if logic:
groups_raw, _ = logic.load_groups_and_indicators()
names = []
if groups_raw:
try:
if hasattr(groups_raw[0], 'name'):
names = sorted([item.name for item in groups_raw])
elif isinstance(groups_raw[0], tuple):
names = sorted([item[1] for item in groups_raw])
else:
names = sorted(groups_raw)
items.extend(names)
except Exception:
pass
cmb_group.configure(values=names)
if names:
cmb_group.set(names[0])
# Вспомогательные функции (_add_to_list логика уже внутри через lambda выше)