Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我可以更改Tkinter中的标题栏吗?_Python_Tkinter - Fatal编程技术网

Python 我可以更改Tkinter中的标题栏吗?

Python 我可以更改Tkinter中的标题栏吗?,python,tkinter,Python,Tkinter,我使用Tkinter作为程序的GUI,但正如我所见,许多程序没有Tkinter那样的标准外观。所谓标准外观,我指的是标准标题栏、边框等 例如,Tkinter的标题栏: vs GitHub的标题栏: 查看他们如何拥有自己的自定义退出、调整大小和最小化按钮?使用Tkinter可以实现这种外观吗 提前感谢!:) 是的,这是可能的。可以使用根窗口上的方法取消标题栏和默认几何图形设置。在此之后,您需要从头开始重新构建所有这些方法,以便按照您的需要对其进行设置。下面是一个功能最少的小型工作示例: roo

我使用Tkinter作为程序的GUI,但正如我所见,许多程序没有Tkinter那样的标准外观。所谓标准外观,我指的是标准标题栏、边框等

例如,Tkinter的标题栏:

vs GitHub的标题栏:

查看他们如何拥有自己的自定义退出、调整大小和最小化按钮?使用Tkinter可以实现这种外观吗


提前感谢!:)

是的,这是可能的。可以使用根窗口上的方法取消标题栏和默认几何图形设置。在此之后,您需要从头开始重新构建所有这些方法,以便按照您的需要对其进行设置。下面是一个功能最少的小型工作示例:

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()