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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 18:23:06