【问题标题】:GTK Focus ChainGTK焦点链
【发布时间】:2016-05-06 04:45:58
【问题描述】:

目前我正在开发一个我想为其设置焦点链的 pyGTK3 应用程序。当使用下面的代码(简化版)时,会发生一些有趣的事情,GTK 正确地关注第一个按钮,但在 tab 上没有任何反应。

起初我以为这是 GTK 不知道链造成的,但后来我尝试 shift+tab 导致链的最后一个元素获得焦点哪个是对的。另一个 shift+tab 不会将焦点从最后一个按钮移开。

所以我认为他们的代码有问题,我需要手动更新链顺序吗?还是我遗漏了什么?

class Screen(Gtk.Grid):
  def __init__(self, parent, core, video_widget):
    Gtk.Grid.__init__(self)

    # adds the control buttons
    self.controls = load_controls(self)

    self.set_focus_chain((self.controls.play, self.controls.backward, self.controls.recording))

【问题讨论】:

  • 不应该在parent或者root容器上设置链吗?
  • 我刚试过,结果证明为了设置链,我应该首先将 self 的焦点链设置为仅包含 container 的列表(在这种情况下为控件),然后是按顺序显示按钮的 self 焦点链。所以我应该将它们堆叠起来以将 gtk 指向正确的方向。 @unwind 你能回答这个问题,以便我可以将其标记为正确答案吗? self.set_focus_chain([self.controls]) self.controls.set_focus_chain((self.controls.play, self.controls.backward, self.controls.recording, self.controls.end_inspection))

标签: python python-2.7 gtk gtk3


【解决方案1】:

为了为容器内的元素设置焦点链,首先需要将父级的焦点链设置为容器。从那里需要设置容器的焦点链。

因此代码需要如下:

# Points Gtk toward the container first
self.set_focus_chain([self.controls]) 

# Sets the focus chain inside the container
self.controls.set_focus_chain((self.controls.play, self.controls.backward, self.controls.recording, self.controls.end_inspection))

所以看起来 GTK 只允许对孩子的焦点链,因此要求用户设置焦点链的链来将焦点链设置为大孩子。

【讨论】:

  • 不幸的是,这似乎自 3.24 以来已被弃用 (valadoc.org/gtk+-3.0/Gtk.Container.set_focus_chain.html) ☹ 它说“要覆盖焦点行为,请使用 GtkWidgetClass::focus 信号。”但没有解释如何重新创建焦点链行为。
  • 是的,这确实是超级不清楚,但在 GTK 问题跟踪器中有一个问题:gitlab.gnome.org/GNOME/gtk/-/issues/1430
  • 有趣。该错误被标记为“GTK4”。这是否意味着它在 3.24 中已被弃用但实际上不会在 3.x 中被删除?到目前为止,除了建议 OP 提交拉取请求之外,似乎几乎没有发生任何事情,尽管他们说有多个领域他们不理解并且不清楚如何使用引用的“焦点”信号。
猜你喜欢
  • 2017-10-22
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多