Search code examples
pythontkinter

Can I change the title bar in Tkinter?


I'm using Tkinter as GUI for my program, but as I see, many programs don't have standard look as Tkinter does. By standard look I mean standard title bar, borders, etc.

For example, Tkinter's title bar:

http://pokit.org/get/img/1a343ad92cd8c8f19ce3ca9c27afecba.jpg

vs GitHub's title bar:

http://pokit.org/get/img/cf5cef0eeae5dcdc02f450733fd87508.jpg

See how they have their own custom exit, resize and minimize buttons? Is it possible to achieve that look using Tkinter?

Thanks in advance! :)


Solution

  • Yes it's possible. You can use the overrideredirect() method on the root window to kill the title bar and the default geometry settings. After that, you need to rebuild all those methods from scratch to set it back up like you want. Here's a small working example with minimal functionality:

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