如何在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
相关产品推荐
相关产品推荐

