Вопрос по python, tkinter – Как установить фокус на виджет Tkinter?

9

У меня есть простое приложение Python + Tkinter, которое отображает список из 10 элементов:

import Tkinter, ttk
list = ttk.Treeview( Tkinter.Tk() )
list.pack( fill = Tkinter.BOTH, expand = 1 )
items = [ list.insert( '', 'end', text = str( i ) ) for i in range( 10 ) ]
list.selection_set( items[ 0 ] )
list.focus_set() # This is not working - list has no focus :(
Tkinter.mainloop()

Можно ли изменить его так, чтобы после запуска приложения список имел фокус, и я мог перемещать выделение с помощью стрелок вверх и вниз? После запуска приложения окно приложения имеет фокус, но я не могу перемещать выделение стрелками, пока не щелкну мышью по списку :(. Я пробовал разные комбинацииfocus_set() а такжеfocus_force(), но это не работает.

Проверено с Python 2.7 на Windows 7, OSX 10.7 и Ubuntu 12.04

UPDATE

Если & quot; Treeview & quot; изменен на какой-то другой виджет, например «Кнопка», фокус работает. Так что кажется, что я как-то неправильно настроил фокус на Treeview.

@ TankorSmash Я не думаю, что функция сломана: Tk / Tkinter уже десятилетия, так что я определенно делаю что-то не так :) grigoryvp
@TankorSmash, если я нажму на виджет, он получит фокус и будет реагировать на клавиши. Так что это не проблема связывания клавиш - это проблема фокуса клавиатуры. grigoryvp
Я тоже пытался заставить это работать, и я не уверен, что вы можете; Похоже, функция не работает. Там есть еще несколько постов, и никто так и не нашел решения. TankorSmash
Я только что проверил, и виджет получает ввод, он просто не использует его для перемещения выделения, так что, может быть, вы могли бы просто написать это самостоятельно? Если<keyDown> переместить выбор-1 Такие вещи. Это лучшее, что я могу понять, помимо перемещения мыши с помощью win32 и щелчка мышью, а затем перемещения мыши обратно в исходное положение. TankorSmash
Хех, ты думаешь, а? Я подклассом Treeview, на__init__ я звонилfocus_set затем позвонилfocus_get сразу же, и он вернул None, предполагая, что ничего не изменилось, даже сtakefocus установлен в1, - Даже отредактировал код Tkinter, сразу послеself.tk.call('focus', self._w) называется, я проверяю, если виджетfocus_has и это все ещеNone, Возможно, что основной цикл должен что-то установить для изменения фокуса, но я сомневаюсь в этом. TankorSmash

Ваш Ответ

1   ответ
9

Наконец-то нашел решение - кажется, чтоTreeview виджет нужно установить фокус два раза: сначала для самого виджета, а затем для элемента:

list.selection_set( items[ 0 ] )
list.focus_set()
list.focus( items[ 0 ] ) # this fixes a problem.

Похожие вопросы