Почему первая кнопка панели инструментов автоматически выбирается при загрузке моего приложения gtk?

Когда мое приложение gtk загружается, автоматически выбирается первый элемент на панели инструментов (он выделяется, нажимается при нажатии Enter). Это незначительная проблема, но я бы предпочел, чтобы ничего не было выбрано по умолчанию.

Вот некоторый базовый пример кода:

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>

person Matthew    schedule 21.05.2009    source источник


Ответы (4)


Это, вероятно, просто GTK+ передает фокус какому-то виджету, ему нравится сфокусироваться на виджете, если это возможно.

Вы можете использовать grab_focus(), чтобы переместить фокус в другое место, чтобы получить желаемое поведение. Однако, если панель инструментов — это все виджеты, которые у вас есть, может быть трудно найти подходящую «цель» фокуса.

person unwind    schedule 22.05.2009

gtk.ToolButton наследует gtk.Bin.

gtk.Bin — это абстрактный базовый класс, определяющий виджет, который является контейнером только с одним дочерним элементом.

Таким образом, кнопка является контейнером и

btn.set_can_focus(False)

не будет работать. Тебе нужно

btn.set_focus_chain([])

или для каждой кнопки на панели инструментов

toolbar.foreach(lambda x: x.set_focus_chain([]))
person user2393229    schedule 17.05.2013

Вы всегда можете добавить виджет и сделать его невидимым, а также перенести на него фокус. Хотя я действительно не считаю это проблемой или знаю кого-то еще, кто это сделал.

person Vadim Peretokin    schedule 13.06.2009

Он имеет фокус, потому что это первый виджет в вашем приложении. Если вы используете Glade, вы можете установить «Имеет фокус» на «Да» для любого другого виджета, и панель инструментов автоматически потеряет фокус при запуске.

person umpirsky    schedule 08.12.2011