Полноэкранное приложение Python 3 Tkinter Borderless

У меня возникла проблема при создании приложения tkinter на Python 3. В настоящее время я использую систему Mac OSX, но обычно я использую систему ОС Windows.

Я хотел бы, чтобы приложение занимало весь экран без заголовка и рамки оконного менеджера вокруг приложения, что часто называют полноэкранным окном без полей в играх.

Я пробовал использовать root.attributes("-fullscreen", True) с root.overrideredirect(True) и root.wm_attributes("-topmost", 1). Однако включение строки root.overrideredirect(True) не позволяет ему нормально работать в полноэкранном режиме; он по-прежнему показывает док-станцию ​​Mac и панель задач, а также нарушает привязку нажатия клавиш в приложении. Без строки 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()

Надеюсь, кто-то сможет помочь! Спасибо!

РЕДАКТИРОВАТЬ: Я только что протестировал это на своем компьютере с Windows. Без self.parent.overrideredirect(True) он создает приложение и работает безупречно (полноэкранный режим без рамки оконного менеджера или строки заголовка). Это должно быть просто проблема OSX.


person jacobian    schedule 24.06.2015    source источник
comment
Вы пробовали изменить корневую геометрию и добавить еще 5 или что-то еще к ширине и / или высоте?   -  person Dan Alexander    schedule 31.07.2015
comment
У меня, к сожалению, не сработало. В любом случае спасибо за предложение. :)   -  person jacobian    schedule 01.08.2015
comment
Выберите ответ или прокомментируйте ответ, который не соответствует требуемому исправлению.   -  person    schedule 08.02.2017


Ответы (2)


Чтобы решить вашу проблему с 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)

Обратите внимание, что я не использую ненастроенный экземпляр tk.Tk () - здесь мой класс - это экземпляр tk.Tk (). Так что мне не нужно перезаписывать родительский элемент, а только «себя», говоря о точке зрения класса.

person R4PH43L    schedule 20.05.2016
comment
Окна инструментов имеют заголовок без значка, кнопки свертывания и разворачивания. У него есть заголовок и кнопка закрытия. Это не лучшее решение. - person JP_; 18.12.2016

person    schedule
comment
Если вы хотите быть более конкретным, ссылка - person Gumboy; 06.11.2017