婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 借助RubyGnome2庫進行GTK下的Ruby GUI編程的基本方法

借助RubyGnome2庫進行GTK下的Ruby GUI編程的基本方法

熱門標簽:白銀外呼paas系統 電銷機器人廠商代理 百度地圖標注自定義圖片 湖州u友防封電銷卡 地圖標注賺錢項目注冊 常德電銷平臺外呼系統軟件價格 高德地圖標注客服 滴滴外呼系統 徐州網絡外呼系統哪個好

前言
隨著RubyGnome2庫越來越完善,以及ruby1.9的性能提升,用Ruby編寫GUI程序漸漸從我的業余愛好轉為我工作的一個重要部分。
 
用Ruby寫程序確實很有樂趣,它可以讓你的想法快速地以一種優雅的方式實現。本文介紹的一個gem就是一個例子,用很少的代碼,實現很有趣的功能,讓編寫Ruby GUI程序變得輕松愉快。
 
RubyGnome2介紹
 
雖然我以前也曾經多次地介紹過RubyGnome2,但我還是想再一次地推薦RubyGnome2,它實在是使用Ruby編寫GUI程序的首選。
 
RubyGnome2是GTK+庫的一個ruby擴展。它對GTK+的對象模型仔細地用Ruby的方式進行封裝,保留了GTK+ API命名方式和含義,因此GTK+的文檔對于RubyGnome2也是適用的---盡管我認為RubyGnome2的文檔已經做得非常不錯了,需要回去借鑒GTK文檔的地方實在不多。
 
雖然GTK本身是由C編寫的,但它有一套完整的精心設計對象體系,使得它的GUI元件可以非常靈活的自由組合,以實現復雜的,功能強大的界面。
 
由于GTK非常重視它的對象體系的靈活性,因此剛開始使用GTK編程并不容易。很多時候表面上看起來很簡單的一個功能,在GTK里面卻要繞幾個彎才能實現。例如要設置一個label的字體,要通過Pango來實現,Pango接管了GTK的所有字體渲染事務....這種“多繞幾個彎”的情況很多,它確實使得編寫GTK程序不那么直接了當。但換來的是整個GTK系統變得非常靈活,以較少的代價實現強大的功能,在跨平臺,換膚,國際化上面都有很好的表現。
 
RubyGnome2繼承了GTK的所有特點,包括優點和缺點。
 
GUI布局
GTK程序的布局很靈活,有許多種容器可選擇。在布局的時候,大多數都是推薦相對位置而不是絕對位置,這樣GUI程序可以更好的適應不同分辨率的屏幕,也有利于特定風格對UI的fine tune。
最常見的容器就是“盒子”,包括“水平盒子”和“垂直盒子”。將可視的UI元件放入“盒子”,不同的“盒子”互相組合疊放就可以構建出目標布局。
 
理論上用盒子就可以構建任何相對位置布局,但是為了方面,GTK還提供了像table這樣的更高級的容器。
 
盒子模型對于許多剛開始GTK編程的人覺得很難適應,即使用了可視化布局工具例如Glade,初學者也往往被盒子模型困擾。可視化布局器最擅長的是固定位置布局。對于相對位置布局,很多時候用代碼構建界面比用Glade反而來的快捷方便。
 
但是用代碼構建界面有一個顯著的缺點,那就是“不直觀”,即很難從代碼中看出UI布局,這樣會給后期維護以及變更帶來麻煩。
 
有一些GUI庫如Shose,用builder風格的代碼來描述UI,使得UI布局可以通過代碼形象地體現出來,如以下這個例子來自shooose.net:
 

Shoes.app { 
 stack(:margin => 4) { 
  button "Mice" 
  button "Eagles" 
  button "Quail" 
 } 
} 

 
 
這樣,我們就可以從代碼中一下子看出UI布局了。
 
builder風格的代碼和HTML很類似,對于熟悉HTML的web界面設計者來說,可視化的編輯器并沒有多大的必要。
 
 
RubyGnome2沒有為我們提供builder方式的布局,因此UI代碼寫起來就像:
 

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 

 
從上面的代碼中很難一下子看出UI布局。
 
如果也為RubyGnome2構建一個builder風格的布局器,那么代碼就會變成:
 

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 

 
 
嗯,這個代碼就和Shose差不多了,可以從代碼中一眼看出UI布局。
 
本文所介紹的GtkSimpleLayout其功能之一就是為RubyGnome2提供builder風格的布局器。
 
GtkSimpleLayout布局器
這個簡單的布局器原先只有200行不到的代碼,我經常是直接拷貝到項目中使用。后來逐漸添了些功能,覺得它變得更有用了,于是便發布到github生成gem,方便感興趣者使用。
 
Source: git://github.com/rickyzheng/GtkSimpleLayout.git
or:
gem source -a http://gems.github.com gem install rickyzheng-GtkSimpleLayout
 
以下是主要功能介紹以及簡單例子。
 
提供Builder風格布局
正如上面的例子中所介紹的,GtkSimpleLayout為RubyGnome2帶來了builder風格的布局功能,只需要為布局的類擴展GtkSimpleLayout::Base即可,一個完整的例子:
 

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 

 
MyWin.new.show_all 
Gtk.main  
 
 
從上面的例子中可以看出,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在這里只是作一個簡單參數的轉換而已。
 
第二個button的":layout => [true, true]"有點特殊。":layout" 參數是GtkSimpleLayout的保留參數,它會被轉換成當這個UI被放入容器時候的參數。這個例子中,容器是vbox(Gtk::VBox),默認的加入方法是Gtk::VBox#pack_start,這個例子中的[true, true] 最終會被傳遞到pack_start,因此這個button在被加入vbox的時候調用的方法以及參數是:"Gtk::VBox#pack_start( button, true, true)"。
 
因此,要使用GtkSimpleLayout,就首先要熟悉RubyGnome2的各個元件,容器的用法,以及參數。當你熟悉了RubyGnome2以后,用GtkSimpleLayout就會非常簡單。
 
批量屬性設置
在UI布局的時候,經常碰到要對一組UI元件設置相同的屬性的情況,例如:

hbox do 
  button 'C', :layout => [false, false, 5] 
  button 'D', :layout => [false, false, 5] 
  button 'E', :layout => [false, false, 5] 
end 

這個時候,可以用"with_attr"來簡化:

hbox do 
 with_attr :layout => [false, false, 5] do 
  button 'C' 
  button 'D' 
  button 'E' 
 end 
end  

 
特殊容器
有些容器的放置子元件的時候有 特殊要求,例如Gtk::HPaned,左邊子窗口要用Gtk::HPaned#add1()來添加,右邊的用Gtk::HPaned#add2()。對于這種容器,GtkSimpleLayout要特別對待,就以hpaned為例:

hpaned do 
 area_first do 
  frame 'first area' 
 end 
 area_second do 
  frame 'second area' 
 end 
end

 

需要特殊對待的容器有:
hpaned/vpaned : 用area_first和area_second來添加子窗口。
table : 用grid來填充格子。
nodebook : 用page來添加子頁。
 
標識UI元件
GtkSimpleLayout用":id => ??"這個參數為UI元件進行標識,例如:

hbox do 
 button 'first', :id => :btn_first 
 button 'second', :id => :btn_second 
end 

 
之后,可以用component()函數取得這個UI元件:

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 

 
 
如果嫌麻煩,GtkSimpleLayout還提供了expose_components()用于自動將所有已標識的元件添加為實例讀屬性(getter):

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 

 
 
自動事件響應映射
如果你嫌顯式調用signal_connect來注冊事件麻煩,那么GtkSimpleLayout為你提供了自動事件響應映射的功能:

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 

 
最后那個'self‘是指宿主容器。
 
UI分組
有時候你希望對UI元件進行分組,這樣就可以對同一組的UI元件進行控制,如使能或禁止整個組。GtkSimpleLayout允許你在布局的時候指定UI組。
GtkSimpleLayout的UI分組規則如下:
默認情況下,已命名的容器(即傳入了:id參數)自動對自己所屬的子元件建立一個組,組名就是容器明。
如果容器傳入:gid=>??參數,則以此名稱為所屬子元件建立組。
允許多個容器的:gid名字相同,這種情況下所屬子元件將歸為同一個組。
可以用“group”來顯式對UI分組,group可以看作是一個虛擬的容器。
用component_children(group_name)來獲取UI組。
 
由于UI分組的例子比較長不在此列出,請參閱源碼中的examples/group.rb文件
 
 
UI與邏輯代碼分離
由于GtkSimpleLayout潛在地迫使使用者分離界面代碼和邏輯處理(或事件響應)代碼,使得整個程序的層次結構更加清晰。對于界面元件比較多的程序,可以很方便的分區進行layout,因為layout的結果還是容器,這個容器又可以放入其他容器組合成更復雜的界面。
 
由于GtkSimpleLayout并不改變RubyGnome2的程序結構,你可以選擇在你的程序中部分或全部使用GtkSimpleLayout。雖然本文所提供的例子都是靜態布局,但由于GtkSimpleLayout是存代碼構建UI,因此你完全可以在布局的時候傳入變量,進行動態布局和動態生成UI,而仍然保持UI代碼的“可視化”。
 
 
有興趣者可以看看GtkSimpleLayout實現的代碼,不過300行而已,這就是Ruby的魅力。
 
最后,貼上一個計算器的界面部分的代碼例子,你能從代碼中看出UI布局么?

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, :layout => [true, true, 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, :set_size_request => [20, 20], :layout => [true, true] 
     end 
    end 
   end 
  end 
 end 
 
end 

 
MyWin.new.show_all 
Gtk.main 

Enjoy it :-)

標簽:梧州 普洱 三沙 永州 公主嶺 荊門 遼寧 張家界

巨人網絡通訊聲明:本文標題《借助RubyGnome2庫進行GTK下的Ruby GUI編程的基本方法》,本文關鍵詞  借助,RubyGnome2,庫,進行,GTK,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《借助RubyGnome2庫進行GTK下的Ruby GUI編程的基本方法》相關的同類信息!
  • 本頁收集關于借助RubyGnome2庫進行GTK下的Ruby GUI編程的基本方法的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲一区免费视频| 亚洲国产wwwccc36天堂| 综合久久综合久久| 成人小视频免费观看| 国产欧美一区二区精品婷婷| 国产在线精品一区二区| 久久嫩草精品久久久久| 福利一区福利二区| 亚洲美女视频在线观看| 在线成人av影院| 捆绑调教一区二区三区| 欧美精品一区二区久久久| 国产成人日日夜夜| 亚洲三级电影网站| 在线不卡欧美精品一区二区三区| 婷婷综合另类小说色区| 国产性色一区二区| 99r精品视频| 日韩专区一卡二卡| 久久九九久久九九| 欧美亚洲动漫精品| 国产最新精品免费| 一区二区在线免费| 久久久噜噜噜久噜久久综合| 在线影院国内精品| 久久成人麻豆午夜电影| 亚洲视频每日更新| 欧美疯狂性受xxxxx喷水图片| 国模娜娜一区二区三区| 亚洲一区二区影院| 国产女主播在线一区二区| 欧洲国内综合视频| 国产成人日日夜夜| 捆绑变态av一区二区三区| 亚洲丝袜美腿综合| 久久综合久久综合亚洲| 欧美日韩精品福利| 色狠狠桃花综合| 国产成人在线免费观看| 日本va欧美va瓶| 亚洲一线二线三线视频| 亚洲国产精品黑人久久久| 欧美一区二区大片| 欧美天堂亚洲电影院在线播放| aaa亚洲精品| 亚洲国产精品一区二区久久恐怖片 | 91麻豆精品视频| 美国一区二区三区在线播放| 亚洲男人的天堂在线aⅴ视频| 久久综合视频网| 欧美一区二区免费视频| 欧美午夜宅男影院| 波多野结衣中文字幕一区| 国产成人免费在线视频| 国产一区二三区好的| 国产在线一区二区| 国产久卡久卡久卡久卡视频精品| 日韩国产高清影视| 天天综合天天做天天综合| 亚洲宅男天堂在线观看无病毒| 亚洲欧洲日韩av| 自拍偷拍欧美激情| 亚洲乱码中文字幕| 亚洲电影第三页| 午夜欧美在线一二页| 丝袜诱惑制服诱惑色一区在线观看| 亚洲国产日日夜夜| 日日夜夜精品视频天天综合网| 五月天国产精品| 麻豆国产欧美日韩综合精品二区| 麻豆精品在线播放| 国产一区在线看| 成人综合婷婷国产精品久久免费| 国产成人亚洲综合色影视| 国产不卡视频在线播放| 成人免费av资源| 色婷婷av久久久久久久| 欧美久久久一区| 欧美一级艳片视频免费观看| 2欧美一区二区三区在线观看视频| 久久久综合精品| 最近中文字幕一区二区三区| 一区二区国产盗摄色噜噜| 无吗不卡中文字幕| 国产又黄又大久久| 在线观看成人小视频| 日韩午夜中文字幕| 国产精品麻豆99久久久久久| 亚洲一区在线观看视频| 石原莉奈在线亚洲三区| 国产剧情av麻豆香蕉精品| 91色乱码一区二区三区| 在线亚洲+欧美+日本专区| 日韩精品一区二区三区在线播放 | 国产69精品久久久久777| 91在线码无精品| 欧美一区二区三区免费观看视频 | 久久久久久久久一| 亚洲精品日日夜夜| 麻豆精品视频在线观看视频| 91伊人久久大香线蕉| 日韩免费一区二区| 一区二区三区国产精品| 国产另类ts人妖一区二区| 欧美日精品一区视频| 亚洲国产精品传媒在线观看| 国产一区二区剧情av在线| 国产精品一二三四| 欧美老年两性高潮| 中文字幕在线观看一区二区| 美国欧美日韩国产在线播放| 不卡一二三区首页| ww亚洲ww在线观看国产| 婷婷丁香激情综合| 一本大道久久a久久精品综合| 久久综合久色欧美综合狠狠| 婷婷久久综合九色国产成人 | 日韩av电影免费观看高清完整版 | 国产精品久久久久久久岛一牛影视 | 欧美高清你懂得| 亚洲色图视频网站| 国产成人免费在线| 精品久久一区二区三区| 亚洲成人免费av| 欧美综合在线视频| 亚洲精品一二三四区| eeuss鲁片一区二区三区在线看| 久久久久99精品一区| 国产一区二区三区久久久| 26uuu亚洲| 国产精品亚洲视频| 国产亚洲一区字幕| 国产福利一区二区三区在线视频| 26uuu另类欧美| 国产激情一区二区三区| 日本一区二区高清| av激情亚洲男人天堂| 中文字幕 久热精品 视频在线 | 337p日本欧洲亚洲大胆精品 | 日本强好片久久久久久aaa| 欧美色图免费看| 日本午夜精品视频在线观看 | 日韩av一区二| 日韩三级.com| 国产激情一区二区三区四区| 国产亚洲欧美色| 91麻豆国产福利精品| 亚洲国产日韩在线一区模特| 欧美撒尿777hd撒尿| 麻豆91在线观看| 中文乱码免费一区二区| 日本韩国一区二区| 免费成人av在线| 国产目拍亚洲精品99久久精品| av在线播放不卡| 首页国产欧美久久| 久久久久久久性| 日本黄色一区二区| 九九九精品视频| 国产精品丝袜黑色高跟| 欧美在线一二三四区| 蜜桃av噜噜一区| 亚洲欧洲成人自拍| 欧美一区二区精品久久911| 国产精品一区二区在线观看不卡 | 91麻豆国产精品久久| 亚洲不卡av一区二区三区| 精品美女一区二区| 91影院在线免费观看| 国产福利视频一区二区三区| 国产精品色呦呦| 国产成人av一区二区三区在线 | 欧美精品久久天天躁| 国精品**一区二区三区在线蜜桃| 国产精品久久久久久久岛一牛影视 | 丝袜美腿亚洲一区二区图片| xfplay精品久久| 欧美精品aⅴ在线视频| 国产不卡在线一区| 喷水一区二区三区| 亚洲免费视频成人| 26uuu色噜噜精品一区| 欧美巨大另类极品videosbest| a级精品国产片在线观看| 蜜桃视频第一区免费观看| 亚洲美腿欧美偷拍| 中文字幕精品综合| 欧美zozozo| 欧美特级限制片免费在线观看| 成人免费视频国产在线观看| 午夜精品久久久久久久久| 亚洲欧洲av在线| 欧美国产欧美综合| 久久综合一区二区| 欧美videos中文字幕| 欧美日韩国产影片| 欧美性生活大片视频| 色婷婷综合五月| 色婷婷av一区二区三区软件| 成人免费毛片app|