Приложение 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()