2012-06-30 21 views
7

Ho una semplice applicazione Python + Tkinter che visualizza un elenco di 10 elementi:Come impostare lo stato attivo del widget Tkinter?

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() 

È possibile modificare in modo dopo all'avvio dell'applicazione, lista avrà fuoco e posso spostare selezione tramite frecce su e giù ? Dopo applicazione si avvia, la finestra dell'applicazione è attiva, ma non può muoversi di selezione con le frecce fino a quando clicco lista con il mouse :(. Ho provato diverse combinazioni di focus_set() e focus_force(), ma non funziona.

Controllato con Python 2.7 Windows 7, OSX 10.7 e Ubuntu 12.04

UPDATE

Se "Treeview" viene modificato in qualche altro widget, ad esempio per "Button", la messa a fuoco è in funzione. Quindi è sembra che ho impostato messa a fuoco per Treeview in qualche modo in modo errato

+1

Ho cercato di ottenere questo lavoro, e io non sono sicuro che tu possa; sembra che la funzione sia rotta. Ci sono alcuni altri post là fuori, e nessuno ha mai trovato la soluzione. – TankorSmash

+0

@TankorSmash Non credo che una funzione sia stata interrotta: Tk/Tkinter ha decenni, quindi sicuramente sto facendo qualcosa di sbagliato :) – grigoryvp

+0

Heh, pensi che eh? Ho suddiviso la Treeview in "__init__', ho chiamato' focus_set', quindi chiamato 'focus_get' subito dopo, e ha restituito None, suggerendo che nulla fosse cambiato, anche con' takefocus' impostato su '1'. - Anche modificato il codice di Tkinter, subito dopo viene chiamato 'self.tk.call ('focus', self._w)', controllo se il widget 'focus_has' ed è ancora' None'. È possibile che il mainloop debba impostare qualcosa in modo che la messa a fuoco cambi, ma ne dubito. – TankorSmash

risposta

8

trovato una soluzione finalmente - sembra che widget di Treeview necessario impostare messa a fuoco due volte: prima per il widget in sé, e in secondo luogo per un elemento:

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