Windows11下Tkinter无边框窗口圆角缺失问题及新解法咨询
Windows 11下Tkinter无边框窗口实现圆角的新方案
在Windows 11中,Tkinter默认窗口的圆角是系统标题栏样式自带的,调用root.overrideredirect(True)移除边框后,系统默认样式失效,圆角也就随之消失。目前Tkinter官方并未针对这个场景更新原生支持,但可以通过调用Windows 11新增的DWM(桌面窗口管理器)API直接设置窗口圆角,无需复杂的旧方案(比如画布裁剪、第三方库依赖)。
实现代码
import tkinter as tk import ctypes from ctypes import wintypes # 定义DWM窗口圆角偏好常量 DWM_WINDOW_CORNER_PREFERENCE_DEFAULT = 0 DWM_WINDOW_CORNER_PREFERENCE_DONOTROUND = 1 DWM_WINDOW_CORNER_PREFERENCE_ROUND = 2 DWM_WINDOW_CORNER_PREFERENCE_ROUNDSMALL = 3 # 加载系统DWMAPI库 dwmapi = ctypes.WinDLL("dwmapi") # 声明函数参数类型,保证调用时类型匹配 dwmapi.DwmSetWindowAttribute.argtypes = [ wintypes.HWND, wintypes.DWORD, wintypes.LPVOID, wintypes.DWORD ] dwmapi.DwmSetWindowAttribute.restype = wintypes.HRESULT # 创建Tkinter窗口 root = tk.Tk() root.overrideredirect(True) # 设置无边框 root.geometry("400x300") root.config(bg="#f0f0f0") # 获取顶层窗口的HWND句柄(Tkinter的winfo_id返回子控件句柄,需用GetParent获取顶层窗口) hwnd = ctypes.windll.user32.GetParent(root.winfo_id()) # 设置窗口为标准圆角 corner_preference = wintypes.DWORD(DWM_WINDOW_CORNER_PREFERENCE_ROUND) dwmapi.DwmSetWindowAttribute( hwnd, 33, # 属性ID对应DWMWA_WINDOW_CORNER_PREFERENCE ctypes.byref(corner_preference), ctypes.sizeof(corner_preference) ) root.mainloop()
关键说明
- 核心是调用Windows 11新增的
DwmSetWindowAttribute函数,通过属性ID33(对应DWMWA_WINDOW_CORNER_PREFERENCE)指定圆角样式 - 可选圆角类型:
DWM_WINDOW_CORNER_PREFERENCE_ROUND:系统标准大小圆角DWM_WINDOW_CORNER_PREFERENCE_ROUNDSMALL:小尺寸圆角DWM_WINDOW_CORNER_PREFERENCE_DONOTROUND:取消圆角
- 必须在
overrideredirect(True)之后设置圆角,否则会被系统默认样式覆盖 - 该方案仅适用于Windows 11及以上版本,因为DWM圆角属性是Win11新增特性
内容的提问来源于stack exchange,提问作者Aj-
相关产品推荐
相关产品推荐

