【问题标题】:Set focus to child window in PyGtk在 PyGtk 中将焦点设置到子窗口
【发布时间】:2018-08-13 12:17:05
【问题描述】:

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

生成日志窗口应该:

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

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

我尝试了几个选项(是焦点,将主窗口设置为瞬态父窗口等),但没有任何效果。我该如何解决这个问题?

【问题讨论】:

    标签: glade pygobject


    【解决方案1】:

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

    我的理解是您希望“生成日志”窗口成为 模态。这意味着当您的模态窗口启动时,其他窗口不能使用,就像对话框窗口一样。此外,您应该将主窗口设置为模态窗口的parent,因为这有助于操作系统窗口管理器,即将对话框保持在主窗口的顶部。

    你可以直接从 Glade 做这两件事(如果你在同一个项目中创建了两个窗口,情况并非总是如此)选择 TrueModal 属性和 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?

    【讨论】:

    • 谢谢。这正是我所需要的
    【解决方案2】:

    创建几个窗口(请参阅您的其他帖子)。 在 init 中上传它们 使用“显示”和“隐藏”在林间空地中向他们显示“信号”

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

    【讨论】:

    • 这样做,我可以一次只隐藏一个窗口,防止访问另一个窗口。虽然这可以缓解问题,但我无法隐藏主窗口,因为那将是糟糕的设计。我希望找到一个可以为“生成日志”窗口设置的属性,以便在关闭之前保持焦点
    猜你喜欢
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 2014-06-20
    相关资源
    最近更新 更多