""" User Selection Dialog - Allows Admin to choose which user identity to use """ import tkinter as tk from tkinter import ttk, messagebox from typing import Optional, Dict, Any, List class UserSelectionDialog: """ Modal dialog for Admin users to select which user identity to use Usage: dialog = UserSelectionDialog(parent, users_list, current_username) selected_user = dialog.get_selected_user() if selected_user: # Use the selected user info """ def __init__(self, parent, users: List[Dict[str, Any]], current_username: str): """ Initialize the user selection dialog Args: parent: The parent Tkinter window users: List of user dictionaries [{id, username, user_type}] current_username: The currently logged-in Admin's username """ self.parent = parent self.users = users self.current_username = current_username self.selected_user = None self.dialog = None self.selected_var = None self._create_dialog() self.parent.wait_window(self.dialog) def _create_dialog(self): """Create the user selection dialog UI""" self.dialog = tk.Toplevel(self.parent) self.dialog.title("选择用户身份") self.dialog.geometry("450x400") self.dialog.resizable(False, False) # Center on screen (not parent) self.dialog.transient(self.parent) self.dialog.grab_set() screen_width = self.dialog.winfo_screenwidth() screen_height = self.dialog.winfo_screenheight() dialog_width = 450 dialog_height = 400 x = (screen_width - dialog_width) // 2 y = (screen_height - dialog_height) // 2 self.dialog.geometry(f"{dialog_width}x{dialog_height}+{x}+{y}") self._create_widgets() def _create_widgets(self): """Create dialog widgets""" main_frame = ttk.Frame(self.dialog, padding="20") main_frame.pack(fill=tk.BOTH, expand=True) # Title title_label = ttk.Label( main_frame, text="请选择要使用的用户身份", font=("", 14, "bold") ) title_label.pack(pady=(0, 20)) # User list with scrollbar list_frame = ttk.Frame(main_frame) list_frame.pack(fill=tk.BOTH, expand=True) scrollbar = ttk.Scrollbar(list_frame) scrollbar.pack(side=tk.RIGHT, fill=tk.Y) self.selected_var = tk.StringVar() # Sort users: current user first, then by username sorted_users = sorted( self.users, key=lambda u: ( 0 if u["username"] == self.current_username else 1, u["username"], ), ) for user in sorted_users: username = user["username"] user_type = user["user_type"] is_current = username == self.current_username # Mark current user display_text = f"{username} ({user_type})" if is_current: display_text += " [当前]" rb = ttk.Radiobutton( list_frame, text=display_text, variable=self.selected_var, value=username, ) rb.pack(anchor=tk.W, pady=3, padx=5) # Select current user by default self.selected_var.set(self.current_username) # Buttons button_frame = ttk.Frame(main_frame) button_frame.pack(pady=(20, 0)) confirm_btn = ttk.Button( button_frame, text="确认", command=self._on_confirm, width=10 ) confirm_btn.pack(side=tk.LEFT, padx=5) cancel_btn = ttk.Button( button_frame, text="取消", command=self._on_cancel, width=10 ) cancel_btn.pack(side=tk.LEFT, padx=5) def _on_confirm(self): """Handle confirm button click""" selected_username = self.selected_var.get() if not selected_username: messagebox.showwarning("未选择", "请选择一个用户") return # Find the selected user for user in self.users: if user["username"] == selected_username: self.selected_user = user break self.dialog.destroy() def _on_cancel(self): """Handle cancel button click""" self.selected_user = None self.dialog.destroy() def get_selected_user(self) -> Optional[Dict[str, Any]]: """ Get the selected user info Returns: User dict {id, username, user_type} if confirmed, None if cancelled """ return self.selected_user