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

如何在tkinter默认窗口管理器的控制区域新增自定义按钮

实现方案说明

原生Tkinter默认调用操作系统的窗口管理器渲染标题栏,没有提供直接修改原生标题栏按钮的接口。最通用的跨平台实现方式是隐藏原生标题栏,自行绘制包含自定义按钮的标题栏区域,实现代码如下:

from tkinter import *
import tkinter as tk

root = Tk()
# 隐藏原生标题栏
root.overrideredirect(True)
root.geometry('500x300')

# 自定义标题栏区域
title_bar = Frame(root, bg="#2c2c2c", relief='raised', bd=0)
title_bar.pack(fill=X)

# 标题文本
title_label = Label(title_bar, text="Program", bg="#2c2c2c", fg="white", padx=10)
title_label.pack(side=LEFT, pady=2)

# 自定义按钮示例:你要新增的功能按钮
custom_btn = Button(title_bar, text="★", bg="#2c2c2c", fg="white", bd=0, padx=8, 
                    command=lambda: print("自定义按钮触发"))
custom_btn.pack(side=RIGHT, pady=2)

# 原有控制按钮:最小化、关闭
min_btn = Button(title_bar, text="_", bg="#2c2c2c", fg="white", bd=0, padx=8,
                 command=lambda: root.iconify())
min_btn.pack(side=RIGHT, pady=2)

close_btn = Button(title_bar, text="×", bg="#2c2c2c", fg="white", bd=0, padx=8,
                   command=root.destroy)
close_btn.pack(side=RIGHT, pady=2)

# 实现窗口拖动功能
def move_window(event):
    root.geometry(f'+{event.x_root - x_offset}+{event.y_root - y_offset}')

def get_offset(event):
    global x_offset, y_offset
    x_offset = event.x
    y_offset = event.y

title_bar.bind('<Button-1>', get_offset)
title_bar.bind('<B1-Motion>', move_window)

# 窗口内容区域
content_frame = Frame(root, bg="white")
content_frame.pack(fill=BOTH, expand=True)

root.mainloop()

补充说明

如果是Windows平台想要修改原生标题栏,可以调用pywin32库的系统API实现,但该方案不兼容macOS和Linux系统,且适配不同Windows版本容易出问题,更推荐上面的自定义标题栏方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:42:02