在 PyGtk 中将焦点设置到子 window
Set focus to child window in PyGtk
我正在 python 使用 PyGObject 和 glade 编写一个简单的应用程序。该应用程序有一个主要的 window 和一个功能性的 window(生成日志,也是一个 Window 对象),它们在单击菜单项时打开。
生成日志 window 应该:
- 显示为特定日期生成日志的选项
- 可最小化并应在任务完成时自动关闭 (OR)
- 如果用户愿意,可以手动关闭
问题是,一旦我显示生成日志 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属性 True
和 Transient 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?
我正在 python 使用 PyGObject 和 glade 编写一个简单的应用程序。该应用程序有一个主要的 window 和一个功能性的 window(生成日志,也是一个 Window 对象),它们在单击菜单项时打开。
生成日志 window 应该:
- 显示为特定日期生成日志的选项
- 可最小化并应在任务完成时自动关闭 (OR)
- 如果用户愿意,可以手动关闭
问题是,一旦我显示生成日志 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属性 True
和 Transient 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?