LINUX.ORG.RU

Установить фокус на окно (Tkinter)

 


0

1

Есть программа, написанная на Python 3 и имеющая GUI-обмотку на Tkinter. Эта программа последовательно создает окна типа Toplevel. Главное окно (root) скрывается методом withdraw или остается не скрытым там, где это нужно. При работе с ней одни и те же окна Tkinter могут после вызова становиться активными, а могут выходить на передний план, но, тем не менее, оставаться неактивными, и приходится либо использовать переключение по Alt+Tab, либо клик мышью, чтобы навести фокус. Сейчас я работаю в openbox, и чтобы окна моей программы попадали в фокус, можно постепенно сворачивать окна других программ, пока на передний план не выйдет окно моей программы. Ввиду этого создалось впечатление, что такое поведение зависит от оконного менеджера/среды. Решил проверить эту гипотезу и установил gnome, kde, xfce4, lxde, fluxbox, icewm. В итоге openbox, lxde, icewm не могли обеспечить нужного мне поведения окон, fluxbox вроде смог, но паузы между разрушением/скрытием окон достигали секунд 2, так что это малоюзабельно. В Gnome и KDE программа работает как нужно, но мне не охота разгребать ту кучу бажного навоза, которая осталась после интеграции моего $HOME с их настройками. В одном из менеджеров посмотрел свойства своего окна, там было что-то типа WM_TAKEFOCUS False и Focus policy Passive. Так что вопрос. Встречались ли вы с таким? Каким образом задается эта Focus policy?

Deleted

import sys
from tkinter import *
makemodal = (len(sys.argv) > 1)

def dialog():
    win = Toplevel()    # создать новое окно
    Label(win, text=’Hard drive reformatted!’).pack() # добавить виджеты
    Button(win, text=’OK’, command=win.destroy).pack() # установить обработчик
    if makemodal:
        win.focus_set() # принять фокус ввода,
        win.grab_set()  # запретить доступ к др. окнам, пока открыт диалог
        win.wait_window() # ждать, пока win не будет уничтожен
        print(‘dialog exit’) # иначе – сразу вернуть управление

root = Tk()
Button(root, text=’popup’, command=dialog).pack()
root.mainloop()

это пример из книги Лутц М. Программирование на Python, том I,4-еиздание. – Пер. с англ. 582 страница.

win.focus_set() Передает окну фокус ввода приложения, как если бы оно было акти- визировано щелчком мыши. У этого метода есть также синоним, fo- cus, и часто фокус ввода устанавливается не на все окно, а на виджет в нем, позволяющий вводить данные (например, Entry). (c)

der_looser ★★
()
Ответ на: комментарий от der_looser

.focus_set() уже имеется на элементах типа Entry или Text всех окон. Проблемы возникают, когда я переключаюсь на другие программы через Alt+Tab, а затем назад и работаю дальше.

Deleted
()
Ответ на: комментарий от Deleted

может надо принудительно еще и на окно повесить .focus_set()? возможно на виджетах оно работает только если окно принимает фокус

der_looser ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.