如何在Ruby中打开一个Glade创建的窗口并等待它关闭?

时间:2014-04-07 23:05:22

标签: ruby gtk glade

我想使用Glade(3.14.2)创建自己的窗口。

在我的计划中的某个时刻,我想 1)放上窗口让用户做东西 2)等待它关闭 3)从窗口对象获取值 4)继续我的代码

所以基本上,我想把窗口视为一个模态对话框 - 但是我编写并控制它。

我已经尝试了几个小时。窗户看起来很好,就像在Glade中设计的那样。用户可以与之交互。

当窗口关闭时,执行与signal_connect(' destroy')连接的代码。

但是,在窗口关闭后,调用窗口的show()方法的代码不会继续执行。

class GrammarNodeEditor
  #this makes the class visual:
  include GladeGUI

  def initialize(raw_node = nil, &close_block)
    @raw_node = raw_node || {type: :Sequence, data: []}
    @original_data = @raw_node[:data]
    @close_block = close_block
  end


  def show
    puts "GNE Window Opening"
    load_glade(__FILE__)
    @builder["window1"].title = "Edit/Create Grammar Node"
    @builder["window1"].signal_connect('destroy') {|*args|
      @close_block.call(self)
      puts "GNE WINDOW DESTROY"
    }
    show_window()
    puts "Done showing window"
  end

以下是我如何调用它:

  rhs_editor = GrammarNodeEditor.new {|obj|
    puts "In closeblck, obj is #{obj.inspect}"
    @rhs = obj.raw_node
  }
  puts "About to call show in GR:Init"
  rhs_editor.show
  puts "Back from calling show in GR:Init"

这是输出:

About to call show in GR:Init
GNE Window Opening
In closeblck, obj is #<GrammarNodeEditor:0x7b82a88 @raw_node={:type=>:Sequence, :data=>[]}, [more junk here]>
GNE WINDOW DESTROY

打开窗口后出现前两行输出。当我关闭窗口时会出现第3和第4个。

请注意&#34;完成显示窗口&#34;和#34;回到GR中的呼叫节目:Init&#34;根本不打印。

为了让这个更有趣,我希望能够从提出另一个窗口的代码中做到这一点。我的顶级窗口有一个用于创建新规则的按钮。必须使用节点初始化规则,然后必须编辑规则。所以首先我需要建立一个Node-definition窗口(如上所示),然后,当我定义了Node时,我想建立一个使用该Node的Rule窗口。

所以我认为我需要在GrammarRuleWindow类(另一个Glade定义的窗口)的initialize()或show()方法中调用此代码。

有人可以解释为什么我的表格没有被打印出来,以及如何通过它们来控制流程?

谢谢!

1 个答案:

答案 0 :(得分:0)

...原来问题是我在Glade中直接创建了窗口的.glade文件,而不是使用VisualRuby IDE。

在VR中创建.glade会在VR需要的文件中添加一些内容。具体来说,文件需要包含行

    <signal name="destroy" handler="destroy_window" swapped="no"/>

在第一个&lt; child ...&gt;之前标签