为什么我的gtk应用程序加载时会自动选择第一个工具栏按钮?

时间:2009-05-21 20:10:40

标签: gtk pygtk glade

当我的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>

4 个答案:

答案 0 :(得分:3)

这可能只是GTK +将焦点交给某个小部件,它喜欢在可能的情况下重点关注小部件。

您可以使用grab_focus()将焦点移到其他位置,以获得所需的行为。如果工具栏是您拥有的所有小工具,则可能很难找到合适的焦点“目标”。

答案 1 :(得分:2)

gtk.ToolButton继承了gtk.Bin。

  

gtk.Bin是一个抽象基类,用于定义一个小部件,它是一个只有一个子的容器。

所以按钮是一个容器,

btn.set_can_focus(False)

不起作用。 你需要

btn.set_focus_chain([])

或工具栏中的每个按钮

toolbar.foreach(lambda x: x.set_focus_chain([]))

答案 2 :(得分:1)

您始终可以添加窗口小部件并使其不可见,并将焦点转移到该窗口小部件。虽然我并不认为这是一个问题,也不知道其他人是谁。

答案 3 :(得分:0)

它具有焦点,因为它是您应用中的第一个小部件。如果您使用glade,则可以将“Has focus”设置为“Yes”到任何其他窗口小部件,工具栏将自动失去对启动的关注。