我想使用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()方法中调用此代码。
有人可以解释为什么我的表格没有被打印出来,以及如何通过它们来控制流程?
谢谢!
答案 0 :(得分:0)
...原来问题是我在Glade中直接创建了窗口的.glade文件,而不是使用VisualRuby IDE。
在VR中创建.glade会在VR需要的文件中添加一些内容。具体来说,文件需要包含行
<signal name="destroy" handler="destroy_window" swapped="no"/>
在第一个&lt; child ...&gt;之前标签