Приложение Python 3 Tkinter Borderless fullscreen
У меня возникла проблема при создании приложения tkinter Python 3. В настоящее время я разрабатываю систему Mac OSX, но обычно использую систему ОС Windows.
Я хотел бы, чтобы приложение занимало весь экран без заголовка Window Manager и рамки вокруг приложения, часто упоминаемого в полноэкранном окне без полей в играх.
Я попытался использовать root.attributes("-fullscreen", True)
с root.overrideredirect(True)
и root.wm_attributes("-topmost", 1)
. Однако включение строки root.overrideredirect(True)
не позволяет ему работать в полноэкранном режиме; он все еще показывает Mac Dock и панель задач, а также нарушает привязки клавиш в приложении. Без строки root.overrideredirect(True)
приложение переходит в полноэкранный режим (скрывая док-станцию и панель задач), но окно не заполняет весь экран; он оставляет пробел внизу, а также сохраняет строку заголовка окна и рамки/рамки.
Вот пример моего кода:
import tkinter as tk
class App(tk.Frame):
def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self, parent)
self.parent = parent
self.initUI()
def initUI(self):
self.parent.title("Fullscreen Application")
self.pack(fill="both", expand=True, side="top")
self.parent.wm_state("zoomed")
self.parent.bind("<F11>", self.fullscreen_toggle)
self.parent.bind("<Escape>", self.fullscreen_cancel)
self.fullscreen_toggle()
self.label = tk.Label(self, text="Fullscreen", font=("default",120), fg="black")
self.label.pack(side="top", fill="both", expand=True)
def fullscreen_toggle(self, event="none"):
self.parent.focus_set()
self.parent.overrideredirect(True)
self.parent.attributes("-fullscreen", True)
self.parent.wm_attributes("-topmost", 1)
def fullscreen_cancel(self, event="none"):
self.parent.overrideredirect(False)
self.parent.attributes("-fullscreen", False)
self.parent.wm_attributes("-topmost", 0)
self.centerWindow()
def centerWindow(self):
sw = self.parent.winfo_screenwidth()
sh = self.parent.winfo_screenheight()
w = sw*0.7
h = sh*0.7
x = (sw-w)/2
y = (sh-h)/2
self.parent.geometry("%dx%d+%d+%d" % (w, h, x, y))
if __name__ == "__main__":
root = tk.Tk()
App(root).pack(side="top", fill="both", expand=True)
root.mainloop()
Я надеюсь, что кто-то сможет помочь! Спасибо!
EDIT: Я только что протестировал это на своем компьютере под управлением Windows. Без self.parent.overrideredirect(True)
он создает приложение и отлично работает по своему желанию (полноэкранный режим без рамки оконного менеджера или панели заголовка). Это просто проблема OSX.
Ответы
Ответ 1
Чтобы исправить проблему с OS-X, я предоставил решение, которое исправляет аналогичную проблему для меня. (Если у вас возникли проблемы с использованием полноэкранного режима между Linux и Windows)
Вы хотели избавиться от панели оконных менеджеров? Посмотрите документы, в котором указывается опция, которая удаляет элементы оконных менеджеров с помощью параметра -toolwindow
.
Что касается размера вашего приложения, вот что помогло мне использовать linux - "ручное масштабирование":
class MyClass(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
self.overrideredirect(True) # depending on your needs
self.attributes("-toolwindow", 1) # this line removes the window managers bar
try: # Automatic zoom if possible
self.wm_state("zoomed")
print("Using automatic zoom")
except tk.TclError: # Manual zoom
# Bad Argument Error is a TclError
print("Using manual zoom")
# get the screen dimensions
width = self.winfo_screenwidth()
height = self.winfo_screenheight()
# build a geometry string.
# form: width x height + x_offset + y_offset
geom_string = "%dx%d+0+0" % (width, height)
self.wm_geometry(geom_string)
Обратите внимание, что я не использую unconfigured tk.Tk() - экземпляр здесь - мой класс - это tk.Tk() - экземпляр. Поэтому мне не нужно перезаписывать родителя, а только "я", говорящий о POV класса.
Ответ 2
#!/usr/bin/python
import Tkinter as tk
class App(tk.Frame):
def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self, parent)
self.parent = parent
self.initUI()
def initUI(self):
self.parent.title("Fullscreen Application")
self.pack(fill="both", expand=True, side="top")
self.parent.wm_state("zoomed")
self.parent.bind("<F11>", self.fullscreen_toggle)
self.parent.bind("<Escape>", self.fullscreen_cancel)
self.fullscreen_toggle()
self.label = tk.Label(self, text="Fullscreen", font=("default",120), fg="black")
self.label.pack(side="top", fill="both", expand=True)
def fullscreen_toggle(self, event="none"):
self.parent.focus_set()
self.parent.overrideredirect(True)
self.parent.overrideredirect(False) #added for a toggle effect, not fully sure why it like this on Mac OS
self.parent.attributes("-fullscreen", True)
self.parent.wm_attributes("-topmost", 1)
def fullscreen_cancel(self, event="none"):
self.parent.overrideredirect(False)
self.parent.attributes("-fullscreen", False)
self.parent.wm_attributes("-topmost", 0)
self.centerWindow()
def centerWindow(self):
sw = self.parent.winfo_screenwidth()
sh = self.parent.winfo_screenheight()
w = sw*0.7
h = sh*0.7
x = (sw-w)/2
y = (sh-h)/2
self.parent.geometry("%dx%d+%d+%d" % (w, h, x, y))
if __name__ == "__main__":
root = tk.Tk()
App(root).pack(side="top", fill="both", expand=True)
root.mainloop()