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