在 PyGtk 中将焦点设置到子 window

Set focus to child window in PyGtk

我正在 python 使用 PyGObject 和 glade 编写一个简单的应用程序。该应用程序有一个主要的 window 和一个功能性的 window(生成日志,也是一个 Window 对象),它们在单击菜单项时打开。

生成日志 window 应该:

  1. 显示为特定日期生成日志的选项
  2. 可最小化并应在任务完成时自动关闭 (OR)
  3. 如果用户愿意,可以手动关闭

问题是,一旦我显示生成日志 window,我也可以直接 select 主要 window。然后,我可以转到菜单并调出任意数量的生成日志 windows。

我尝试了几个选项(是 Focus,将 main window 设置为 Transient parent 等)但没有任何效果。我该如何解决这个问题?

创建多个 windows(查看您的其他 post)。 在 init 中上传它们 在林间空地使用 "show" 和 "hide"

向他们展示 "signals"
class GUIxxxx
  #...
  def action1(self, widget, data=None):
     self.window1.show()

  def action2(self, widget, data=None):
     # do something here
     self.window1.hide()

首先你说 PyGTK,然后你说 PyGObject,这是两个不同的东西。我将回答 PyGTK(我的来源来自 GTK+ 2 文档),因为它在标题中,也许寻找它的人会在这里结束。但不要害怕,因为对于这个问题,两者的答案实际上(我认为完全相同)相同。

我的理解是你希望你 "Generate log" window 成为 模态。这意味着其他 windows 在您的模式 window 启动时无法使用,就像对话框 window 一样。您还应该将主 window 设置为模态 window 的 parent,因为这有助于 OS Window 管理器,即将对话框保持在顶部主要window。

你可以直接从 Glade 做这两件事(如果你在同一个项目中创建了两个 windows,并非总是如此)选择 Modal属性 TrueTransient for Window 属性到您的主要 window,在您的生成日志 window 的常规属性部分.

您也可以使用 child window.
set_modal()set_transient_for(parent_window) 方法以编程方式完成此操作 假设你的 parent window 被称为 main_window 而 child window 是 generate_log_window,那么你可以这样做:

generate_log_window.set_modal(gtk.TRUE)  
generate_log_window.set_transient_for(main_window)  

如果您希望它显示在主 window 的中心顶部,请执行此操作

generate_log_window.set_position(gtk.WIN_POS_CENTER_ON_PARENT)  

关于你的第二点,可以从 Glade 中设置最小化的能力。

来源:
GTK+ 2 GtkWindow reference set_modal
GTK+ 2 GtkWindow reference set_transient_for
PyGTK FAQ: How do I get my windows to show up where I want
PyGTK FAQ: How do I make a dialog block the whole application, so the user is forced to answer it?