如何禁用Tkinter窗口右上角关闭按钮且保留标题栏
解决方案:仅禁用Tkinter窗口的关闭按钮(保留标题栏)
Tkinter本身没有原生支持单独禁用关闭按钮,但可以通过平台相关的API实现需求,以下分系统给出具体实现:
Windows平台
需要依赖pywin32库(先执行pip install pywin32安装),通过修改系统菜单移除关闭选项,让标题栏的关闭按钮变灰禁用:
import win32api import win32con from tkinter import Tk class RegisterClass(SendOtp): def __init__(self): super().__init__() self.window = Tk() self.window.title("Register") self.window.geometry("925x500+300+200") self.window.configure(bg="#fff") self.window.resizable(False, False) # 禁用关闭按钮 hwnd = self.window.winfo_id() system_menu = win32api.GetSystemMenu(hwnd, False) win32api.DeleteMenu(system_menu, win32con.SC_CLOSE, win32con.MF_BYCOMMAND) self.window.mainloop()
Linux平台
通过绑定WM_DELETE_WINDOW协议到空函数,让点击关闭按钮无响应(按钮仍可见但失效):
from tkinter import Tk class RegisterClass(SendOtp): def __init__(self): super().__init__() self.window = Tk() self.window.title("Register") self.window.geometry("925x500+300+200") self.window.configure(bg="#fff") self.window.resizable(False, False) # 绑定关闭事件到空操作 self.window.protocol("WM_DELETE_WINDOW", lambda: None) self.window.mainloop()
如果需要彻底让按钮变灰,需借助Xlib库实现,逻辑相对复杂,上述方法是最简便的替代方案。
macOS平台
通过PyObjC库操作原生NSWindow对象禁用关闭按钮(先执行pip install pyobjc安装):
from tkinter import Tk from AppKit import NSWindow class RegisterClass(SendOtp): def __init__(self): super().__init__() self.window = Tk() self.window.title("Register") self.window.geometry("925x500+300+200") self.window.configure(bg="#fff") self.window.resizable(False, False) # 获取原生NSWindow对象并禁用关闭按钮 hwnd = self.window.winfo_id() ns_window = NSWindow.windowWithWindowNumber_(hwnd) close_button = ns_window.standardWindowButton_(NSWindow.closeButton) close_button.setEnabled_(False) self.window.mainloop()
补充说明
- 若需跨平台兼容,可通过
sys.platform判断当前系统,分支执行对应逻辑; overrideredirect(1)会完全移除标题栏,不符合你的需求,因此不推荐使用。
内容的提问来源于stack exchange,提问作者Dilip
相关产品推荐
相关产品推荐

