如何在Tkinter窗口中仅移除关闭按钮(保留最大化和最小化按钮)
如何在Tkinter窗口中仅移除关闭按钮(保留最大化和最小化按钮)
我明白你的痛点——你现在的代码虽然能保留Alt+Tab切换窗口的功能,但把标题栏的所有按钮都移除了,这可不是你想要的效果。问题出在你移除了WS_SYSMENU样式,这个样式不仅关联着窗口左上角的系统菜单,还和关闭按钮的显示绑定在一起,同时它也是最小化、最大化按钮正常显示的前提之一。咱们调整一下代码,只针对关闭按钮动手,保留另外两个按钮和Alt+Tab功能。
解决方案思路
我们需要保留WS_SYSMENU、WS_MINIMIZEBOX和WS_MAXIMIZEBOX这三个关键样式,然后通过Windows API修改窗口的系统菜单,删除其中的关闭选项,同时拦截窗口的关闭事件,确保用户无法通过任何方式触发关闭操作。这样标题栏只会显示最小化和最大化按钮,关闭按钮会被彻底移除(或变灰失效)。
修改后的完整代码
import tkinter as tk from ctypes import windll class CustomWindow(tk.Tk): def __init__(self): super().__init__() self.title("仅保留最小化/最大化按钮") self.geometry("400x300") # 获取窗口句柄 hwnd = windll.user32.GetParent(self.winfo_id()) # 定义窗口样式常量 GWL_STYLE = -16 WS_MINIMIZEBOX = 0x20000 WS_MAXIMIZEBOX = 0x10000 WS_SYSMENU = 0x80000 # 获取当前窗口样式并调整:保留系统菜单、最小化和最大化按钮 current_style = windll.user32.GetWindowLongA(hwnd, GWL_STYLE) new_style = current_style | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU windll.user32.SetWindowLongA(hwnd, GWL_STYLE, new_style) # 修改系统菜单,移除关闭选项 SM_CLOSE = 0xF060 MF_BYCOMMAND = 0x00000000 system_menu = windll.user32.GetSystemMenu(hwnd, False) if system_menu: # 删除关闭菜单项,标题栏的关闭按钮会随之消失 windll.user32.DeleteMenu(system_menu, SM_CLOSE, MF_BYCOMMAND) # 拦截窗口关闭事件,防止Alt+F4等方式关闭窗口 def on_attempt_close(): # 可以在这里添加提示,或者什么都不做 pass self.protocol("WM_DELETE_WINDOW", on_attempt_close) self.update_idletasks() if __name__ == "__main__": app = CustomWindow() app.mainloop()
关键代码说明
- 保留
WS_SYSMENU:这个样式是标题栏按钮显示的基础,移除它会导致所有按钮消失,所以必须保留。 - 删除系统菜单中的关闭项:通过
GetSystemMenu获取系统菜单句柄,再用DeleteMenu删除关闭选项,这样标题栏的关闭按钮会直接消失。如果你只想让按钮变灰而非消失,可以把DeleteMenu换成windll.user32.EnableMenuItem(system_menu, SM_CLOSE, 0x00000002)(0x00000002对应MF_GRAYED常量)。 - 拦截关闭事件:通过
protocol("WM_DELETE_WINDOW", ...)拦截窗口的关闭请求,防止用户通过Alt+F4、任务管理器右键关闭等方式关闭窗口(如果不需要拦截,可以去掉这部分)。
这样调整后,你的窗口就能完美实现“仅移除关闭按钮,保留最大化、最小化按钮且支持Alt+Tab”的需求啦!
备注:内容来源于stack exchange,提问作者E-Gamma-102
相关产品推荐
相关产品推荐

