Python 我可以更改Tkinter中的标题栏吗?
我使用Tkinter作为程序的GUI,但正如我所见,许多程序没有Tkinter那样的标准外观。所谓标准外观,我指的是标准标题栏、边框等 例如,Tkinter的标题栏: vs GitHub的标题栏: 查看他们如何拥有自己的自定义退出、调整大小和最小化按钮?使用Tkinter可以实现这种外观吗Python 我可以更改Tkinter中的标题栏吗?,python,tkinter,Python,Tkinter,我使用Tkinter作为程序的GUI,但正如我所见,许多程序没有Tkinter那样的标准外观。所谓标准外观,我指的是标准标题栏、边框等 例如,Tkinter的标题栏: vs GitHub的标题栏: 查看他们如何拥有自己的自定义退出、调整大小和最小化按钮?使用Tkinter可以实现这种外观吗 提前感谢!:) 是的,这是可能的。可以使用根窗口上的方法取消标题栏和默认几何图形设置。在此之后,您需要从头开始重新构建所有这些方法,以便按照您的需要对其进行设置。下面是一个功能最少的小型工作示例: roo
提前感谢!:) 是的,这是可能的。可以使用根窗口上的方法取消标题栏和默认几何图形设置。在此之后,您需要从头开始重新构建所有这些方法,以便按照您的需要对其进行设置。下面是一个功能最少的小型工作示例:
root = Tk()
def move_window(event):
root.geometry('+{0}+{1}'.format(event.x_root, event.y_root))
root.overrideredirect(True) # turns off title bar, geometry
root.geometry('400x100+200+200') # set new geometry
# make a frame for the title bar
title_bar = Frame(root, bg='white', relief='raised', bd=2)
# put a close button on the title bar
close_button = Button(title_bar, text='X', command=root.destroy)
# a canvas for the main area of the window
window = Canvas(root, bg='black')
# pack the widgets
title_bar.pack(expand=1, fill=X)
close_button.pack(side=RIGHT)
window.pack(expand=1, fill=BOTH)
# bind title bar motion to the move window function
title_bar.bind('<B1-Motion>', move_window)
root.mainloop()
root=Tk()
def move_窗口(事件):
几何体('+{0}+{1}'。格式(event.x_root,event.y_root))
root.overrideredirect(True)#关闭标题栏、几何图形
根.几何体('400x100+200+200')#设置新几何体
#为标题栏创建一个框架
标题栏=框架(根,背景为白色,浮雕为凸起,bd=2)
#在标题栏上放置“关闭”按钮
关闭按钮=按钮(标题栏,text='X',command=root.destroy)
#窗口主要区域的画布
窗口=画布(根,bg='black')
#打包小部件
标题栏包装(展开=1,填充=X)
关闭按钮。包装(侧面=右侧)
window.pack(扩展=1,填充=2)
#将标题栏运动绑定到“移动窗口”功能
标题栏绑定(“”,移动窗口)
root.mainloop()
大多数人在使用上述“移动窗口”方法时会知道有错误;我找到了一个修复程序,可以获得鼠标的准确位置,并随鼠标移动,而不是从角落移动:
def get_pos(event):
xwin = app.winfo_x()
ywin = app.winfo_y()
startx = event.x_root
starty = event.y_root
ywin = ywin - starty
xwin = xwin - startx
def move_window(event):
app.geometry("400x400" + '+{0}+{1}'.format(event.x_root + xwin, event.y_root + ywin))
startx = event.x_root
starty = event.y_root
app.TopFrame.bind('<B1-Motion>', move_window)
app.TopFrame.bind('<Button-1>', get_pos)
def get_pos(事件):
xwin=app.winfo_x()
ywin=app.winfo_y()
startx=event.x_root
starty=event.y\u root
ywin=ywin-starty
xwin=xwin-startx
def move_窗口(事件):
app.geometry(“400x400”+'+{0}+{1}.格式(event.x_root+xwin,event.y_root+ywin))
startx=event.x_root
starty=event.y\u root
应用程序顶部框架绑定(“”,移动窗口)
应用程序顶部框架绑定(“”,获取位置)
在python3.5.2中,我必须进行一些修改以使其正常工作:
#custom title bar for tkinter
from tkinter import Tk, Frame, Button, Canvas
root = Tk()
def move_window(event):
root.geometry('+{0}+{1}'.format(event.x_root, event.y_root))
root.overrideredirect(True) # turns off title bar, geometry
root.geometry('400x100+200+200') # set new geometry
# make a frame for the title bar
title_bar = Frame(root, bg='white', relief='raised', bd=2)
# put a close button on the title bar
close_button = Button(title_bar, text='Close this Window', command=root.destroy)
# a canvas for the main area of the window
window = Canvas(root, bg='black')
# pack the widgets
title_bar.pack(expand=1, fill="x")
close_button.pack(side="right")
window.pack(expand=1, fill="both")
# bind title bar motion to the move window function
title_bar.bind('<B1-Motion>', move_window)
root.mainloop()
#tkinter的自定义标题栏
从tkinter导入Tk、框架、按钮、画布
root=Tk()
def move_窗口(事件):
几何体('+{0}+{1}'。格式(event.x_root,event.y_root))
root.overrideredirect(True)#关闭标题栏、几何图形
根.几何体('400x100+200+200')#设置新几何体
#为标题栏创建一个框架
标题栏=框架(根,背景为白色,浮雕为凸起,bd=2)
#在标题栏上放置“关闭”按钮
关闭按钮=按钮(标题栏,text='close this Window',command=root.destroy)
#窗口主要区域的画布
窗口=画布(根,bg='black')
#打包小部件
标题栏包装(展开=1,填充=x)
关闭按钮。包装(侧面=“右侧”)
window.pack(expand=1,fill=“两者”)
#将标题栏运动绑定到“移动窗口”功能
标题栏绑定(“”,移动窗口)
root.mainloop()
这些是我使用python 3.7.2所做的修改
from Tkinter import *
root=Tk()
root.overrideredirect(True) # turns off title bar, geometry
root.geometry('400x100+200+200') # set new geometry
# make a frame for the title bar
title_bar = Frame(root, bg='#2e2e2e', relief='raised', bd=2,highlightthickness=0)
# put a close button on the title bar
close_button = Button(title_bar, text='X', command=root.destroy,bg="#2e2e2e",padx=2,pady=2,activebackground='red',bd=0,font="bold",fg='white',highlightthickness=0)
# a canvas for the main area of the window
window = Canvas(root, bg='#2e2e2e',highlightthickness=0)
# pack the widgets
title_bar.pack(expand=1, fill=X)
close_button.pack(side=RIGHT)
window.pack(expand=1, fill=BOTH)
xwin=None
ywin=None
# bind title bar motion to the move window function
def move_window(event):
root.geometry('+{0}+{1}'.format(event.x_root, event.y_root))
def change_on_hovering(event):
global close_button
close_button['bg']='red'
def return_to_normalstate(event):
global close_button
close_button['bg']='#2e2e2e'
title_bar.bind('<B1-Motion>', move_window)
close_button.bind('<Enter>',change_on_hovering)
close_button.bind('<Leave>',return_to_normalstate)
root.mainloop()
从Tkinter导入*
root=Tk()
root.overrideredirect(True)#关闭标题栏、几何图形
根.几何体('400x100+200+200')#设置新几何体
#为标题栏创建一个框架
标题栏=框架(根,背景='#2E',浮雕='凸起',bd=2,高亮厚度=0)
#在标题栏上放置“关闭”按钮
关闭按钮=按钮(标题栏,text='X',command=root.destroy,bg=“#2e”,padx=2,pady=2,activebackground='red',bd=0,font=“bold”,fg='white',highlightthickness=0)
#窗口主要区域的画布
window=Canvas(根,bg='#2e',highlightthickness=0)
#打包小部件
标题栏包装(展开=1,填充=X)
关闭按钮。包装(侧面=右侧)
window.pack(扩展=1,填充=2)
xwin=无
ywin=无
#将标题栏运动绑定到“移动窗口”功能
def move_窗口(事件):
几何体('+{0}+{1}'。格式(event.x_root,event.y_root))
def change_on_悬停(事件):
全局关闭按钮
关闭按钮['bg']=“红色”
def返回正常状态(事件):
全局关闭按钮
关闭按钮['bg']='2E'
标题栏绑定(“”,移动窗口)
关闭按钮。绑定(“”,在悬停时更改)
关闭按钮。绑定(“”,返回正常状态)
root.mainloop()
说明:我们使用bd(边框厚度)=0从按钮中删除边框
然后我们将
事件绑定到一个函数
更改前景色。为了返回其原始状态,我们将
事件绑定到另一个函数
初始状态
将鼠标光标悬停在其上后状态发生变化 注意:光标不可见,因为我的屏幕捕获软件以某种方式删除了它 现在更新到python 3.8 以及标题栏和背景的新变量 主要内容背景和标题名称添加 和新背景+清除一些缩进错误
from tkinter import *
root = Tk()
# turns off title bar, geometry
root.overrideredirect(True)
# set new geometry
root.geometry('400x100+200+200')
# set background color of title bar
back_ground = "#2c2c2c"
# set background of window
content_color = "#ffffff"
# make a frame for the title bar
title_bar = Frame(root, bg=back_ground, relief='raised', bd=1, highlightcolor=back_ground,highlightthickness=0)
# put a close button on the title bar
close_button = Button(title_bar, text='x', command=root.destroy,bg=back_ground, padx=5, pady=2, activebackground="red", bd=0, font="bold", fg='white', activeforeground="white", highlightthickness=0)
# window title
title_window = "Title Name"
title_name = Label(title_bar, text=title_window, bg=back_ground, fg="white")
# a canvas for the main area of the window
window = Canvas(root, bg="white", highlightthickness=0)
# pack the widgets
title_bar.pack(expand=1, fill=X)
title_name.pack(side=LEFT)
close_button.pack(side=RIGHT)
window.pack(expand=1, fill=BOTH)
x_axis = None
y_axis = None
# bind title bar motion to the move window function
def move_window(event):
root.geometry('+{0}+{1}'.format(event.x_root, event.y_root))
def change_on_hovering(event):
global close_button
close_button['bg'] = 'red'
def return_to_normal_state(event):
global close_button
close_button['bg'] = back_ground
title_bar.bind('<B1-Motion>', move_window)
close_button.bind('<Enter>', change_on_hovering)
close_button.bind('<Leave>', return_to_normal_state)
root.mainloop()
从tkinter导入*
root=Tk()
#关闭标题栏、几何图形
root.overrideredirect(True)
#设置新几何图形
根几何体('400x100+200+200')
#设置标题栏的背景色
背面接地=“#2c2c”
#设置窗口的背景
content_color=“#ffffff”
#为标题栏创建一个框架
标题栏=框架(根部,背景=背面,浮雕=凸起,bd=1,highlightcolor=背面,highlightthickness=0)
#在标题栏上放置“关闭”按钮
关闭按钮=按钮(标题栏,text='x',command=root.destroy,bg=back\u ground,padx=5,pady=2,activebackground=“red”,bd=0,font=“bold”,fg='white',activeforeground=“white”,highlightthickness=0)
#窗口标题
title\u window=“title Name”
title\u name=标签(title\u栏,text=title\u窗口,bg=背景,fg=“白色”)
#窗口主要区域的画布
窗口=画布(根,bg=“白色”,highlightthickness=0)
#打包小部件
标题栏包装(展开=1,填充=X)
标题\包装名称(侧面=左侧)
关闭按钮。包装(侧面=右侧)
window.pack(扩展=1,填充=2)
x_轴=无
尤娜
from tkinter import *
window = Tk()
bg = "#f5f6f7"
title_window = "test app"
class app:
def __init__(self, main):
self.main = main
self.main.configure(bg=bg)
self.main.overrideredirect(True)
self.main.geometry('230x130')
self.main.resizable(width=False, height=False)
self.top_bar = Frame(main,bg=bg, cursor="sizing")
self.top_bar.pack(fill=X)
self.title_txt = Label(self.top_bar, text=title_window ,bg=bg)
self.title_txt.pack(side="left", padx=3)
close_btn = Button(self.top_bar,text="x", cursor="arrow", bg=bg, fg="black", highlightthickness=0,activebackground="red", activeforeground="white",bd=0, command=self.main.quit)
close_btn.pack(side="right")
bottom_bar = Frame(main, bg=bg)
bottom_bar.pack()
label_scr = Label(bottom_bar, text="label 1", padx=100, pady=5, bg=bg)
label_scr.grid(row=0, column=0, columnspan=3)
button_scr = Button(bottom_bar, text="Button1", bg=bg, bd=0)
button_scr.grid(row=2, column=0, columnspan=3, pady=3)
button2_scr = Button(bottom_bar, text="Button2", bg=bg,bd=0)
button2_scr.grid(row=3, column=0, columnspan=3, pady=3)
def move_window(event):
window.geometry(f"+{event.x_root}+{event.y_root}")
execution = app(window)
execution.top_bar.bind('<B1-Motion>', move_window)
execution.title_txt.bind('<B1-Motion>', move_window)
window.mainloop()