在PyGtk中将焦点设置到子窗口

时间:2018-08-13 12:17:05

标签: glade pygobject

我正在使用PyGObject和Glade在python中编写一个简单的应用程序。该应用程序具有一个主窗口和一个功能窗口(“生成日志”,还有一个“窗口”对象),该窗口在单击菜单项时会打开。

“生成日志”窗口应该:

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

问题是,一旦我显示了“生成日志”窗口,我也可以直接选择主窗口。然后,我可以转到菜单,并根据需要调出尽可能多的“生成日志”窗口。

我尝试了几种方法(例如“聚焦”,将主窗口设置为“瞬态父级”等),但没有任何效果。我该如何解决?

2 个答案:

答案 0 :(得分:0)

创建多个窗口(请参阅其他文章)。 通过 init 上传它们 使用“显示”和“隐藏”在林间中向他们显示“信号”

class GUIxxxx
  #...
  def action1(self, widget, data=None):
     self.window1.show()

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

答案 1 :(得分:0)

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

据我了解,您希望“生成日志”窗口为模式。这意味着在您的模式窗口打开时不能使用其他窗口,就像对话框窗口一样。另外,您应该将主窗口设置为模态窗口的parent,因为这有助于OS窗口管理器,即,将对话框保持在主窗口顶部。

Yo可以直接从Glade(如果您在同一个项目中创建了两个窗口,但并非总是如此)创建这两种方法,选择 Modal 归因于True,然后在“生成日志”窗口的“常规属性”部分中,将 Transient for Window 属性设置为主窗口。

您还可以使用子窗口的set_modal()set_transient_for(parent_window)方法以编程方式进行操作。
假设您的父窗口名为main_window,子窗口名为generate_log_window,则可以这样操作:

generate_log_window.set_modal(gtk.TRUE)  
generate_log_window.set_transient_for(main_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?