借助RubyGnome2库进行GTK下的Ruby GUI编程的基本方法
前言 Shoes.app { stack(:margin => 4) { button "Mice" button "Eagles" button "Quail" } } class MyWin < Gtk::Window def initialize super vbox = Gtk::VBox.new btn_mice = Gtk::Button.new 'Mice' vbox.pack_start btn_mice btn_eagles = Gtk::Button.new 'Eagles' vbox.pack_start btn_eagles btn_quail = Gtk::Button.new 'Quail' vbox.pack_start btn_quail add vbox end end class MyWin < Gtk::Window def initialize super add my_layout end def my_layout vbox do button 'Mice' button 'Eagles' button 'Quail' end end end require 'gtk2' require 'simple_layout' class MyWin < Gtk::Window include SimpleLayout::Base def initialize super add my_layout signal_connect('destroy') do Gtk.main_quit end end def my_layout hbox do label 'Hello,' button 'World !' end end end 从上面的例子中可以看出,GtkSimpleLayout并没有改变RubyGnome2程序的主框架,它只是一个扩充。 属性设置 在放置UI元件的时候,往往需要设置初始属性,或者要指定布局参数。GtkSimpleLayout用Hash来传递这些属性与参数,例如: vbox do button 'sensitive = false',:sensitive => false # 初始为disable状态 button 'expand space',:layout => [true,true] # 指定这个button填充剩余空间 end 上面这个例子中,第一个button的初始状态为disable。 ":sensitive => false"这个参数最终被转换成属性设置:Gtk::Button#sensitive=false,至于Gtk::Button有那些属性可以设置,请参阅RubyGnome2 API文档或GTK文档。GtkSimpleLayout在这里只是作一个简单参数的转换而已。 hbox do button 'C',:layout => [false,false,5] button 'D',5] button 'E',5] end 这个时候,可以用"with_attr"来简化: hbox do with_attr :layout => [false,5] do button 'C' button 'D' button 'E' end end hpaned do area_first do frame 'first area' end area_second do frame 'second area' end end
需要特殊对待的容器有: hbox do button 'first',:id => :btn_first button 'second',:id => :btn_second end my_first_button = component(:btn_first) my_second_button = component(:btn_second) ... my_first_button.signal_connect('clicked') do puts "first button clicked" end my_second_button.signal_connect('clicked') do puts "second button clicked" end expose_components() # 将自动添加btn_first和btn_second这两个读属性(getter)。 ... btn_first.signal_connect('clicked') do puts "first button clicked" end btn_second.signal_connect('clicked') do puts "second button clicked" end require 'gtk2' require 'simple_layout' class MyWin < Gtk::Window include SimpleLayout::Base def initialize super add my_layout register_auto_events() # 注册自动事件响应映射 end def my_layout hbox do button "First',:btn_first button "Second",:btn_second end end # 事件响应函数 def btn_first_on_clicked(*_) puts "First button clicked" end # 事件响应函数 def btn_second_on_clicked(*_) puts "Second button clicked" end # 退出事件响应函数 def self_on_destroy(*_) Gtk.main_quit end end require 'gtk2' require 'simple_layout' class MyWin < Gtk::Window include SimpleLayout::Base def initialize super add my_layout signal_connect('destroy') do Gtk.main_quit end end def my_layout vbox do with_attr :border_width => 3 do hbox do entry :id => :ent_input,5] end hbox do frame do label 'M',:set_size_request => [20,20] end hbutton_box do button 'Backspace' button 'CE' button 'C' end end hbox do vbutton_box do button 'MC' button 'MR' button 'MS' button 'M+' end with_attr :layout => [true,true] do number_and_operators_layout end end end end end def number_and_operators_layout vbox do [ ['7','8','9','/','sqt'],['4','5','6','*','%'],['1','2','3','-','1/x'],['0','+/=','.','+','=']].each do |cols| hbox :layout => [true,true] do cols.each do |txt| button txt,20],true] end end end end end end Enjoy it :-) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |