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

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-

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 05:02:38