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?
def showAbout(self):
if self.aboutOpen==0:
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.showAbout())
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.aboutOpen=1
self.about.protocol("WM_DELETE_WINDOW", lambda: self.showAbout())
self.closeButton.focus_force()
self.contact.bind('<Leave>', self.contactMouseOver)
self.contact.bind('<开发者_Go百科Enter>', self.contactMouseOver)
self.contact.bind('<Button-1>', self.mailAuthor)
else:
self.about.destroy()
self.aboutOpen=0
def contactMouseOver(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 mailAuthor(self,event):
import webbrowser
webbrowser.open('mailto:adress@gmail.com',new=1)
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)
# # 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.
from tkinter import *
qw=Tk()
qw.resizable(0,0) #will disable max/min tab of window
qw.mainloop()
from tkinter import *
qw=Tk()
qw.overrideredirect(1) # will remove the top badge of window
qw.mainloop()
here are the two ways to disable maximize and minimize option in tkinter
remember the code for button shown in image is not in example as this is solution regarding how to make max/min tab nonfunctional or how to remove
Windows
For windows, you can use -toolwindow attribute like that:
root.attributes('-toolwindow', True)
So if you want complete code, it's that
from tkinter import *
from tkinter import ttk
root = Tk()
root.attributes('-toolwindow', True)
root.mainloop()
Other window.attributes attributes:
-alpha
-transparentcolor
-disabled
-fullscreen
-toolwindow
-topmost
Important note this is only working with Windows. Not MacOS
Mac
With mac you can use overredirect attribute and a "x" button to close the window and this will do the job. :D like that:
from tkinter import *
from tkinter import ttk
window = Tk()
window.overredirect(True)
Button(window, text="x", command=window.destroy).pack()
window.mainloop()
Inspired by https://www.delftstack.com/howto/python-tkinter/how-to-create-full-screen-window-in-tkinter/
For me, it's working, i have a windows 7.
Comment me if i have a error.
I merged answers from @demyaN and the others, and the following is a way to get the job done.
import ctypes as ct
from tkinter import *
def setWinStyle(root):
set_window_pos = ct.windll.user32.SetWindowPos
set_window_long = ct.windll.user32.SetWindowLongPtrW
get_window_long = ct.windll.user32.GetWindowLongPtrW
get_parent = ct.windll.user32.GetParent
# Identifiers
gwl_style = -16
ws_minimizebox = 131072
ws_maximizebox = 65536
swp_nozorder = 4
swp_nomove = 2
swp_nosize = 1
swp_framechanged = 32
hwnd = get_parent(root.winfo_id())
old_style = get_window_long(hwnd, gwl_style) # Get the style
new_style = old_style & ~ ws_maximizebox & ~ ws_minimizebox # New style, without max/min buttons
set_window_long(hwnd, gwl_style, new_style) # Apply the new style
set_window_pos(hwnd, 0, 0, 0, 0, 0, swp_nomove | swp_nosize | swp_nozorder | swp_framechanged) # Updates
window = Tk()
Button(window, text="button").pack() # add your widgets here.
window.after(10, lambda: setWinStyle(window)) #call to change style after the mainloop started. Directly call setWinStyle will not work.
window.mainloop()
By the way, using window.attributes('-toolwindow', True)
will remove the minimize and maximize boxes, but it will make the app not display in the taskbar, which is a problem for me.
Removing minimize/maximize buttons using ctypes
import ctypes as ct
set_window_pos = ct.windll.user32.SetWindowPos
set_window_long = ct.windll.user32.SetWindowLongPtrW
get_window_long = ct.windll.user32.GetWindowLongPtrW
get_parent = ct.windll.user32.GetParent
# Identifiers
gwl_style = -16
ws_minimizebox = 131072
ws_maximizebox = 65536
swp_nozorder = 4
swp_nomove = 2
swp_nosize = 1
swp_framechanged = 32
hwnd = get_parent(settings_panel.winfo_id())
# Get the style
old_style = get_window_long(hwnd, gwl_style)
# New style, without max/min buttons
new_style = old_style & ~ ws_maximizebox & ~ ws_minimizebox
# Apply the new style
set_window_long(hwnd, gwl_style, new_style)
# Updates
set_window_pos(hwnd, 0, 0, 0, 0, 0, swp_nomove | swp_nosize | swp_nozorder | swp_framechanged)
精彩评论