Perché il primo pulsante di barra selezionato automaticamente quando i miei carichi applicazione GTK?
Domanda
Quando i miei carichi applicazione GTK, il primo elemento sulla barra degli strumenti viene selezionato automaticamente (è evidenziato, viene premuto quando ha colpito entrare). Questo è solo un problema minore, ma preferirei per niente di essere selezionati per impostazione predefinita.
Ecco alcuni esempi di codice di base:
import gtk
import gtk.glade
window_tree = gtk.glade.XML('testtoolbar.glade')
gtk.main()
testtoolbar.glade
<?xml version="1.0"?>
<glade-interface>
<!-- interface-requires gtk+ 2.16 -->
<!-- interface-naming-policy project-wide -->
<widget class="GtkWindow" id="window1">
<property name="width_request">200</property>
<property name="visible">True</property>
<child>
<widget class="GtkToolbar" id="toolbar1">
<property name="visible">True</property>
<child>
<widget class="GtkToolButton" id="toolbutton1">
<property name="visible">True</property>
<property name="label" translatable="yes">toolbutton1</property>
<property name="use_underline">True</property>
<property name="stock_id">gtk-new</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
<child>
<widget class="GtkToolButton" id="toolbutton2">
<property name="visible">True</property>
<property name="label" translatable="yes">toolbutton2</property>
<property name="use_underline">True</property>
<property name="stock_id">gtk-open</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
</widget>
</child>
</widget>
</glade-interface>
Soluzione
Questo è probabilmente solo GTK + consegnando la messa a fuoco per un po 'di widget, le piace un widget si sono concentrati, se possibile.
È possibile utilizzare grab_focus()
per spostare l'attenzione altrove, per ottenere il comportamento desiderato. Se la barra degli strumenti è tanto widgetry si dispone, potrebbe essere difficile trovare un focus adeguato "target", però.
Altri suggerimenti
gtk.ToolButton eredita gtk.Bin.
gtk.Bin è una classe base astratta che definisce un widget che è un contenitore con un solo bambino .
Quindi, il pulsante è un contenitore e
btn.set_can_focus(False)
non funzionerà. È necessario
btn.set_focus_chain([])
o per ogni pulsante nella barra degli strumenti
toolbar.foreach(lambda x: x.set_focus_chain([]))
È sempre possibile aggiungere un widget e renderlo invisibile, e trasferire attenzione ad esso. Anche se non mi trovo che questo sia un problema o sa di chiunque altro che ha fatto.
E 'concentrarsi, perché è il primo widget nella tua app. Se si utilizza radura, è possibile impostare "Has focus" su 'Sì' a qualsiasi altro widget e la barra degli strumenti verrà automaticamente perdere la concentrazione sulla partenza.