Tkinter Toplevel组件支持哪些协议?如何获取完整协议清单?
Great question! Let's break this down into two clear parts: the additional Tkinter protocols you can use, and a cleaner way to make your window follow the main window.
Additional Tkinter Protocols
Beyond the WM_DELETE_WINDOW, WM_SAVE_YOURSELF, and WM_TAKE_FOCUS you already know, there are several other window manager protocols supported by Tkinter (since it's a wrapper for Tcl/Tk):
WM_ICONIFY: Triggered when the window is minimized (iconified) by the window manager.WM_DEICONIFY: Fired when the window is restored from a minimized state.WM_QUIT: Handles requests to quit the application (behavior can vary slightly across window managers).WM_CHANGE_STATE: Used to request a change in the window's state (e.g., switching from normal to minimized).WM_STATE: A protocol for querying or setting the current state of the window.
For the full, authoritative list, you can refer to the core Tcl/Tk documentation (since Tkinter inherits all Tcl/Tk's window manager interactions). You can also explore Tkinter's source code or test binding other protocol names with root.protocol() to see which are supported on your platform.
Cleaner Follow-Window Implementation
Your current approach works but isn't robust—let's fix that with a more elegant, reliable method. First, never create multiple Tk() instances in Tkinter; use Toplevel() for secondary windows to avoid event loop conflicts. Then, we'll listen for the main window's <Configure> event, which triggers whenever the window moves or resizes.
Here's the improved code:
import tkinter as tk root = tk.Tk() root.config(width=100, height=100) root.geometry("100x100") # Explicitly set initial size for consistency # Use Toplevel instead of a second Tk instance follow_window = tk.Toplevel(root) follow_window.overredirect(True) follow_window.geometry("180x40") def update_follow_position(event): # Get main window's current position and dimensions root_x = root.winfo_x() root_y = root.winfo_y() root_height = root.winfo_height() # Calculate follow window position (adjust offsets as needed) follow_x = root_x + 8 follow_y = root_y + root_height + 51 follow_window.geometry(f"+{follow_x}+{follow_y}") # Bind the main window's configure event to update position root.bind("<Configure>", update_follow_position) # Set initial position before mainloop starts update_follow_position(None) root.mainloop()
Key Improvements:
- Uses
Toplevelfor the secondary window, which is the standard Tkinter practice for child windows. - The
<Configure>event ensures the follow window updates in real time whenever the main window moves or resizes. - Code is more readable, with clear variable names and explicit calculations.
- Initial position is set upfront so the follow window starts in the correct spot.
内容的提问来源于stack exchange,提问作者Superior

