You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何禁用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 11:10:23