You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用Python(wxPython)修改Windows窗口标题栏颜色

嘿,我来帮你搞定这两个标题栏颜色修改的问题!

1. 如何使用Python修改窗口标题栏颜色

首先得明确:标题栏是系统级UI组件,Python本身没有跨平台的通用API直接修改它——不同操作系统(Windows、macOS、Linux)的实现逻辑差异很大。这里重点说你大概率关心的Windows平台方案:

在Windows上,我们可以通过调用系统的DWM(桌面窗口管理器)API来修改单个窗口的标题栏颜色,不需要改动全局系统设置。核心是用ctypes库调用DwmSetWindowAttribute函数,步骤很清晰:

  • 获取目标窗口的系统句柄(HWND)
  • 调用DwmSetWindowAttribute,指定DWMWA_CAPTION_COLOR属性(值为35),传入你想要的颜色值

举个用Tkinter的示例(其他GUI库逻辑完全相通):

import tkinter as tk
import ctypes
from ctypes import wintypes

# 创建基础Tk窗口
root = tk.Tk()
root.title("自定义标题栏颜色")
root.geometry("400x300")

# 获取窗口的系统句柄
hwnd = ctypes.windll.user32.GetParent(root.winfo_id())

# 配置DWM API参数
DWMWA_CAPTION_COLOR = 35
dwmapi = ctypes.WinDLL('dwmapi')
DwmSetWindowAttribute = dwmapi.DwmSetWindowAttribute
DwmSetWindowAttribute.argtypes = [wintypes.HWND, wintypes.DWORD, wintypes.LPCVOID, wintypes.DWORD]
DwmSetWindowAttribute.restype = wintypes.HRESULT

# 设置标题栏颜色(这里是深蓝色,注意Windows的COLORREF格式是0x00BBGGRR,和常规RGB顺序相反)
caption_color = wintypes.DWORD(0x001E90FF)  # 对应常规RGB(0, 144, 255)
DwmSetWindowAttribute(hwnd, DWMWA_CAPTION_COLOR, ctypes.byref(caption_color), ctypes.sizeof(caption_color))

root.mainloop()

注意:这个方法仅支持Windows Vista及以上系统(DWM从Vista开始引入)。


2. Windows系统下用wxPython修改窗口标题栏颜色

wxPython本身没有直接封装修改标题栏颜色的API,但我们可以沿用上面的思路:结合wx窗口的句柄,调用Windows的DWM API来实现。我基于你提供的代码做了完整修改和优化:

import wx
import ctypes
from ctypes import wintypes

# 预先配置DWM相关API
DWMWA_CAPTION_COLOR = 35
dwmapi = ctypes.WinDLL('dwmapi')
DwmSetWindowAttribute = dwmapi.DwmSetWindowAttribute
DwmSetWindowAttribute.argtypes = [wintypes.HWND, wintypes.DWORD, wintypes.LPCVOID, wintypes.DWORD]
DwmSetWindowAttribute.restype = wintypes.HRESULT

app = wx.App(False)

# 你的原始窗口代码
window = wx.Frame(None, title="test con")
window.SetSize(1024, 920)
# 增加图标加载容错,避免路径错误导致程序崩溃
try:
    window.SetIcon(wx.Icon("eq.ico"))
except Exception as e:
    print(f"图标加载失败: {e},将使用默认图标")
window.SetBackgroundColour('#b4e4ed')

# 获取wx窗口对应的系统句柄
hwnd = window.GetHandle()

# 设置标题栏颜色(这里用和窗口背景色相近的浅蓝色,注意COLORREF格式是0x00BBGGRR)
# #b4e4ed对应RGB(180,228,237),转成COLORREF就是0x00EDE4B4
caption_color = wintypes.DWORD(0x00EDE4B4)
result = DwmSetWindowAttribute(hwnd, DWMWA_CAPTION_COLOR, ctypes.byref(caption_color), ctypes.sizeof(caption_color))

if result != 0:
    print("修改标题栏颜色失败:可能系统版本低于Windows Vista,不支持DWM功能")

window.Show(True)
app.MainLoop()

几个关键细节:

  • 通过window.GetHandle()拿到wx窗口的系统句柄,这是连接wx和系统API的核心桥梁
  • 颜色值必须遵循Windows的COLORREF格式:0x00BBGGRR,和我们常用的RGB顺序相反,转换的时候要注意
  • 增加了图标加载的容错处理,避免因为图标文件路径错误导致程序直接崩溃

内容的提问来源于stack exchange,提问作者tadas

火山引擎 最新活动