Удаление кнопок свернуть / развернуть в Tkinter
У меня есть программа на Python, которая открывает новые окна для отображения некоторой информации "о". Это окно имеет свою собственную кнопку закрытия, и я сделал его неизменяемым. Однако, кнопки, чтобы максимизировать и минимизировать это все еще там, и я хочу, чтобы они исчезли.
Я использую Tkinter, оборачивая всю информацию для отображения в классе Tk.
Код пока приведен ниже. Я знаю, что это не красиво, и я планирую расширить информацию, превращая ее в класс, но я хочу разобраться в этой проблеме, прежде чем двигаться дальше.
Кто-нибудь знает, как я могу определить, какие кнопки по умолчанию отображаются в диспетчере Windows?
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('<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)
5 ответов
В общем, то, какие украшения WM (оконный менеджер) решает отобразить, не может быть легко продиктовано таким инструментарием, как Tkinter. Итак, позвольте мне обобщить то, что я знаю, плюс то, что я нашел:
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()
Существует также возможность того, что для Toplevel
кроме окна root, вы можете сделать:
toplevel.transient(1)
и это удалит кнопки min/max, но это также зависит от оконного менеджера. Из того, что я прочитал, MS Windows WM действительно удаляет их.
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()
Вот два способа отключить максимизацию и минимизировать опцию в tkinter
помните, что код для кнопки, показанный на рисунке, не приведен в качестве примера, так как это решение относительно того, как сделать вкладку max/min неработоспособной или как удалить
Windows
Для окон вы можете использовать атрибут -toolwindow следующим образом:
root.attributes('-toolwindow', True)
Итак, если вам нужен полный код, это
from tkinter import *
from tkinter import ttk
root = Tk()
root.attributes('-toolwindow', True)
root.mainloop()
Другие атрибуты window.attributes:
-alpha
-transparentcolor
-disabled
-fullscreen
-toolwindow
-topmost
Важное примечание: это работает только с Windows. Не MacOS
Mac
В Mac вы можете использовать атрибут overredirect и кнопку "x", чтобы закрыть окно, и это сделает свою работу.:D вот так:
from tkinter import *
from tkinter import ttk
window = Tk()
window.overredirect(True)
Button(window, text="x", command=window.destroy).pack()
window.mainloop()
На основе https://www.delftstack.com/howto/python-tkinter/how-to-create-full-screen-window-in-tkinter/
У меня работает, у меня windows 7.
Прокомментируйте меня, если у меня есть ошибка.
Я объединил ответы от @demyaN и других, и следующий способ выполнить работу.
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()
Кстати, с помощьюwindow.attributes('-toolwindow', True)
удалит окна свертывания и развертывания, но приложение не будет отображаться на панели задач, что для меня является проблемой.
Удаление кнопок свертывания/разворачивания с помощью 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)