Загрузка данных
# -*- coding: utf-8 -*-
"""
Авторизация vFinal. С силовым выводом окна.
"""
import tkinter as tk
from tkinter import ttk
import ctypes
import sqlite3
class AuthInterface(tk.Toplevel):
def __init__(self, master, on_login_click=None):
super().__init__(master)
self.on_login_command = on_login_click
# --- БАЗОВЫЕ ПАРАМЕТРЫ ---
self.title("Авторизация")
self.resizable(False, False)
# Принудительно задаем размер ДО любых сеток
win_w, win_h = 300, 150
self.geometry(f"{win_w}x{win_h}")
# --- ЖЕСТКОЕ ПОЗИЦИОНИРОВАНИЕ ЧЕРЕЗ WINAPI ---
user32 = ctypes.windll.user32
screen_w = user32.GetSystemMetrics(0) # SM_CXSCREEN
screen_h = user32.GetSystemMetrics(1) # SM_CYSCREEN
pos_x = int((screen_w / 2) - (win_w / 2))
pos_y = int((screen_h / 2) - (win_h / 2))
# Форсируем позицию минуя логику Tkinter
self.geometry(f"+{pos_x}+{pos_y}")
# Принудительная отрисовка всех запросов ОС прямо сейчас
self.update_idletasks()
# --- ИНТЕРФЕЙС ТОЛЬКО ПОСЛЕ ТОГО, КАК ОКНО НАРИСОВАНО ---
frame = ttk.Frame(self, padding=20)
frame.pack(fill="both", expand=True)
ttk.Label(frame, text="Логин:").grid(row=0, column=0, sticky="w")
self.login_entry = ttk.Entry(frame, width=25)
self.login_entry.grid(row=0, column=1, pady=5)
ttk.Label(frame, text="Пароль:").grid(row=1, column=0, sticky="w")
self.password_entry = ttk.Entry(frame, show="*", width=25)
self.password_entry.grid(row=1, column=1, pady=5)
btn_frame = ttk.Frame(frame)
btn_frame.grid(row=2, column=0, columnspan=2, pady=15)
login_btn = ttk.Button(btn_frame, text="Войти", command=self._try_login)
login_btn.pack(side="left", padx=5)
exit_btn = ttk.Button(btn_frame, text="Выход", command=self.destroy)
exit_btn.pack(side="left", padx=5)
self.login_entry.focus()
# --- ЖЕСТКИЙ ЗАХВАТ ФОКУСА И ПОДНЯТИЕ НАД ВСЕМ ---
self.lift() # Поднимаем окно выше других
self.focus_force() # Принудительно забираем фокус ввода
self.grab_set() # Делаем окно модальным (блокируем всё остальное)
# Еще одна принудительная проверка перед захватом фокуса
self.update_idletasks()
def _try_login(self):
username = self.login_entry.get().strip()
password = self.password_entry.get().strip()
print(f"[AUTH DEBUG] Логин='{username}', Пароль есть: {len(password) > 0}")
if not username or not password:
from tkinter import messagebox
messagebox.showwarning("Ошибка", "Поля не могут быть пустыми")
return
try:
from modules.administrator.user_logic import UserLogic
db_manager = UserLogic()
# Проверяем путь к файлу физически
import os
if not os.path.exists(db_manager.db_path):
raise FileNotFoundError(f"База users.db не найдена! Путь: {db_manager.db_path}")
success = db_manager.validate_credentials(username, password)
print(f"[AUTH DEBUG] validate_credentials вернула: {success}")
if success:
role = None
with sqlite3.connect(db_manager.db_path) as conn:
row = conn.execute("SELECT role FROM users WHERE login=?", (username,)).fetchone()
if row:
role = row[0]
print(f"[AUTH DEBUG] Роль извлечена: '{role}'")
if callable(self.on_login_command):
# Вызываем колбэк главного окна
self.on_login_command(username, role)
print("[AUTH DEBUG] Колбэк выполнен, закрываем окно.")
self.destroy()
else:
print("[FATAL ERROR] on_login_command is not callable!")
else:
from tkinter import messagebox
messagebox.showerror("Ошибка", "Неверный логин или пароль")
self.password_entry.delete(0, tk.END)
self.password_entry.focus()
except Exception as e:
from tkinter import messagebox
messagebox.showerror("Критическая ошибка", str(e))
print(f"[FATAL LOGIN ERROR]: {e}")