Как исправить вертикальное смещение курсора tkinter в полноэкранном режиме на macOS? - PullRequest
1 голос
/ 27 мая 2019

У меня проблема с тем, что Tkinter обнаружил неправильную позицию курсора, когда приложение работает в полноэкранном режиме на macOS.

Я создал приложение Python 3 с графическим интерфейсом Tkinter в macOS (Mojave). Приложение работает хорошо, пока не нажата зеленая полноэкранная кнопка. После этого строка меню скрывается, как и ожидалось, но окно увеличивается только до 2560x1395 на дисплее 2560x1440. Интерфейс также обнаруживает курсор мыши выше того места, где он появляется на экране, что делает невозможным использование приложения. Я пытался заставить приложение расширяться до полной высоты 1440, но оно сразу же возвращается к 1395.

Вот минимальный случай, демонстрирующий проблему:

import tkinter as tk

def test():
    print("Test")

root = tk.Tk()
tk.Button(root, text="Test", width=20, command=test).pack()
root.mainloop()

В обычном оконном режиме нажатие кнопки приводит к печати «Тест». В полноэкранном режиме пользователь должен щелкнуть мышью под кнопкой, чтобы клик был зарегистрирован. Выход из приложения в полноэкранном режиме также вызывает ошибку сегментации.

В моем приложении, щелкнув там, где находится красная точка, открывается OptionMenu: Clicking where the red dot is causes the menu to open

1 Ответ

0 голосов
/ 28 мая 2019

Приложения, которые поддерживают macOS, правильно открываются на отдельной вкладке «Рабочий стол» при использовании в полноэкранном режиме. Насколько я заметил, это не относится к tkinter, окно расширяется, чтобы полностью соответствовать размеру экрана на главной вкладке рабочего стола.

Почему в полноэкранном режиме происходит смещение?

Смещение имеет заголовок , который скрывается в полноэкранном режиме, но не регистрируется и соответственно перемещает все виджеты. Вот почему щелчки мыши регистрируются + 24 (высота заголовка) от клика. Чтобы избежать этого, мы используем root.attributes('-fullscreen', 1).


Для выхода из полноэкранного режима мы можем использовать <Escape> bind , поскольку клавиша Escape в большинстве приложений предназначена для выхода из полноэкранного режима, как в Safari . Вы также можете использовать Button.

root.bind('<Escape>', lambda e: root.attributes('-fullscreen', 0))

Мне не удалось найти обработчик событий для полноэкранного режима на Mac, поэтому я использовал <Configure> с условием root.attributes('-fullscreen'), чтобы проверить, нажал ли пользователь на полноэкранный режим или нет.

Это то, что я придумал.

from tkinter import *

root = Tk()
Button(root, width=20, text='Hello').pack()

def full_screen(evt=None):
    # checks if the window is in fullscreen
    if root.attributes('-fullscreen'):  
        root.attributes('-fullscreen',1)
        # Remove the borders and titlebar
        root.overrideredirect(True) 
        root.overrideredirect(False)

root.bind('<Configure>', full_screen)
# Escape bind to exit fullscreen.
root.bind('<Escape>', lambda e: root.attributes('-fullscreen', 0))
root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...