pythonwindowstkinter

Removing minimize/maximize buttons in Tkinter


I have a python program which opens a new windows to display some 'about' information. This window has its own close button, and I have made it non-resizeable. However, the buttons to maximize and minimize it are still there, and I want them gone.

I am using Tkinter, wrapping all the info to display in the Tk class.

The code so far is given below. I know its not pretty, and I plan on expanding the info making it into a class, but I want to get this problem sorted before moving along.

Anyone know how I can govern which of the default buttons are shown by the windows manager?

import webbrowser

class MyWindow(Tk):
    def show_about(self):
        
        if self.about_open == False:
            self.about = Tk()
            self.about.title("About " + self.programName)
            
            Label(self.about, text="%s: Version 1.0" % self.programName ,foreground='blue').pack()
            Label(self.about, text="By Vidar").pack()
            self.contact=Label(self.about,text="Contact: adress@gmail.com",font=("Helvetica", 10))
            self.contact.pack()
            self.closeButton=Button(self.about, text="Close", command = lambda: self.show_about())
            self.closeButton.pack()
            self.about.geometry("%dx%d+%d+%d" % (175,
                                95,
                                self.myParent.winfo_rootx()+self.myParent.winfo_width()/2-75,
                                self.myParent.winfo_rooty()+self.myParent.winfo_height()/2-35))
        
            self.about.resizable(0,0)
            self.about_open=True
            self.about.protocol("WM_DELETE_WINDOW", lambda: self.show_about())
            self.closeButton.focus_force()
            
            
            self.contact.bind('<Leave>', self.contact_mouse_over)
            self.contact.bind('<Enter>', self.contact_mouse_over)
            self.contact.bind('<Button-1>', self.mail_author)
        else:
            self.about.destroy()
            self.about_open=False
            
    def contact_mouse_over(self, event):
        if event.type == str(7):
            self.contact.config(font=("Helvetica", 10, 'underline'))
        elif event.type == str(8):
            self.contact.config(font=("Helvetica", 10))
            
    def mail_author(self, event):
        webbrowser.open('mailto:adress@gmail.com', new=1)
    

Solution

  • In general, what decorations the WM (window manager) decides to display can not be easily dictated by a toolkit like Tkinter. So let me summarize what I know plus what I found:

    import Tkinter as tk
    
    root= tk.Tk()
    
    root.title("wm min/max")
    
    # this removes the maximize button
    root.resizable(0,0)
    
    # # if on MS Windows, this might do the trick,
    # # but I wouldn't know:
    # root.attributes(toolwindow=1)
    # or
    # root.attributes("-toolwindow", 1)
    
    # # for no window manager decorations at all:
    # root.overrideredirect(1)
    # # useful for something like a splash screen
    
    root.mainloop()
    

    There is also the possibility that, for a Toplevel window other than the root one, you can do:

    toplevel.transient(1)
    

    and this will remove the min/max buttons, but it also depends on the window manager. From what I read, the MS Windows WM does remove them.