校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁(yè) > 知識(shí)庫(kù) > 借助RubyGnome2庫(kù)進(jìn)行GTK下的Ruby GUI編程的基本方法

借助RubyGnome2庫(kù)進(jìn)行GTK下的Ruby GUI編程的基本方法

熱門標(biāo)簽:白銀外呼paas系統(tǒng) 電銷機(jī)器人廠商代理 百度地圖標(biāo)注自定義圖片 湖州u友防封電銷卡 地圖標(biāo)注賺錢項(xiàng)目注冊(cè) 常德電銷平臺(tái)外呼系統(tǒng)軟件價(jià)格 高德地圖標(biāo)注客服 滴滴外呼系統(tǒng) 徐州網(wǎng)絡(luò)外呼系統(tǒng)哪個(gè)好

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

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

 
 
這樣,我們就可以從代碼中一下子看出UI布局了。
 
builder風(fēng)格的代碼和HTML很類似,對(duì)于熟悉HTML的web界面設(shè)計(jì)者來說,可視化的編輯器并沒有多大的必要。
 
 
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構(gòu)建一個(gè)builder風(fēng)格的布局器,那么代碼就會(huì)變成:
 

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 

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

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程序的主框架,它只是一個(gè)擴(kuò)充。
 
 
屬性設(shè)置
在放置UI元件的時(shí)候,往往需要設(shè)置初始屬性,或者要指定布局參數(shù)。GtkSimpleLayout用Hash來傳遞這些屬性與參數(shù),例如:
 

vbox do 
 button 'sensitive = false', :sensitive => false # 初始為disable狀態(tài) 
 button 'expand space', :layout => [true, true] # 指定這個(gè)button填充剩余空間 
end 

上面這個(gè)例子中,第一個(gè)button的初始狀態(tài)為disable。 ":sensitive => false"這個(gè)參數(shù)最終被轉(zhuǎn)換成屬性設(shè)置:Gtk::Button#sensitive=false,至于Gtk::Button有那些屬性可以設(shè)置,請(qǐng)參閱RubyGnome2 API文檔或GTK文檔。GtkSimpleLayout在這里只是作一個(gè)簡(jiǎn)單參數(shù)的轉(zhuǎn)換而已。
 
第二個(gè)button的":layout => [true, true]"有點(diǎn)特殊。":layout" 參數(shù)是GtkSimpleLayout的保留參數(shù),它會(huì)被轉(zhuǎn)換成當(dāng)這個(gè)UI被放入容器時(shí)候的參數(shù)。這個(gè)例子中,容器是vbox(Gtk::VBox),默認(rèn)的加入方法是Gtk::VBox#pack_start,這個(gè)例子中的[true, true] 最終會(huì)被傳遞到pack_start,因此這個(gè)button在被加入vbox的時(shí)候調(diào)用的方法以及參數(shù)是:"Gtk::VBox#pack_start( button, true, true)"。
 
因此,要使用GtkSimpleLayout,就首先要熟悉RubyGnome2的各個(gè)元件,容器的用法,以及參數(shù)。當(dāng)你熟悉了RubyGnome2以后,用GtkSimpleLayout就會(huì)非常簡(jiǎn)單。
 
批量屬性設(shè)置
在UI布局的時(shí)候,經(jīng)常碰到要對(duì)一組UI元件設(shè)置相同的屬性的情況,例如:

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

這個(gè)時(shí)候,可以用"with_attr"來簡(jiǎn)化:

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

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

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

 

需要特殊對(duì)待的容器有:
hpaned/vpaned : 用area_first和area_second來添加子窗口。
table : 用grid來填充格子。
nodebook : 用page來添加子頁(yè)。
 
標(biāo)識(shí)UI元件
GtkSimpleLayout用":id => ??"這個(gè)參數(shù)為UI元件進(jìn)行標(biāo)識(shí),例如:

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

 
之后,可以用component()函數(shù)取得這個(gè)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()用于自動(dòng)將所有已標(biāo)識(shí)的元件添加為實(shí)例讀屬性(getter):

expose_components() # 將自動(dòng)添加btn_first和btn_second這兩個(gè)讀屬性(getter)。  

... 
btn_first.signal_connect('clicked') do 
 puts "first button clicked" 
end 
 
btn_second.signal_connect('clicked') do 
 puts "second button clicked" 
end 

 
 
自動(dòng)事件響應(yīng)映射
如果你嫌顯式調(diào)用signal_connect來注冊(cè)事件麻煩,那么GtkSimpleLayout為你提供了自動(dòng)事件響應(yīng)映射的功能:

require 'gtk2' 
require 'simple_layout' 
 
class MyWin  Gtk::Window 
 include SimpleLayout::Base 
 def initialize 
  super 
  add my_layout 
  register_auto_events() # 注冊(cè)自動(dòng)事件響應(yīng)映射 
 end 
 
 def my_layout 
  hbox do 
   button "First', :btn_first 
   button "Second", :btn_second 
  end 
 end 
 
 # 事件響應(yīng)函數(shù) 
 def btn_first_on_clicked(*_) 
  puts "First button clicked" 
 end 
 
 # 事件響應(yīng)函數(shù) 
 def btn_second_on_clicked(*_) 
  puts "Second button clicked" 
 end 
 
 # 退出事件響應(yīng)函數(shù) 
 def self_on_destroy(*_) 
  Gtk.main_quit 
 end 
end 

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

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

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《借助RubyGnome2庫(kù)進(jìn)行GTK下的Ruby GUI編程的基本方法》,本文關(guān)鍵詞  借助,RubyGnome2,庫(kù),進(jìn)行,GTK,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《借助RubyGnome2庫(kù)進(jìn)行GTK下的Ruby GUI編程的基本方法》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于借助RubyGnome2庫(kù)進(jìn)行GTK下的Ruby GUI編程的基本方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    av电影天堂一区二区在线观看| 一区二区三国产精华液| 成人一区二区三区视频| 亚洲精品日产精品乱码不卡| 欧美日韩国产综合视频在线观看 | 免费成人美女在线观看.| 精品黑人一区二区三区久久| 成人精品高清在线| 午夜影院在线观看欧美| 久久婷婷一区二区三区| 在线国产亚洲欧美| 国产在线麻豆精品观看| 亚洲男人的天堂av| 日韩精品中文字幕在线一区| 91麻豆成人久久精品二区三区| 免费成人av在线播放| 亚洲欧美激情插| 国产女主播视频一区二区| 欧美精品aⅴ在线视频| 99国产精品久久久| 风间由美一区二区三区在线观看| 亚洲国产欧美日韩另类综合 | 精品在线观看视频| 一区二区欧美国产| 国产欧美精品一区二区三区四区| 欧美男生操女生| 91在线观看美女| 成人免费毛片高清视频| 久久福利视频一区二区| 美女性感视频久久| 久久不见久久见中文字幕免费| 图片区小说区国产精品视频| 亚洲精品日韩一| 一级女性全黄久久生活片免费| 日韩毛片一二三区| 一区二区三区在线视频观看58| 国产精品久久久久久一区二区三区 | 成人av资源下载| 91在线观看下载| 色94色欧美sute亚洲线路一久| 久久不见久久见免费视频1| 亚洲精品v日韩精品| 久久久.com| 日韩欧美国产综合在线一区二区三区| 成年人国产精品| 国产在线视频精品一区| 免费高清在线视频一区·| 亚洲综合小说图片| 国产精品美女久久久久久 | 国产高清成人在线| 国产91丝袜在线播放0| 99re66热这里只有精品3直播| 一本久道中文字幕精品亚洲嫩| 欧洲精品在线观看| 制服丝袜一区二区三区| 欧美大片在线观看一区| 中文字幕乱码亚洲精品一区| 亚洲视频香蕉人妖| 秋霞成人午夜伦在线观看| 夫妻av一区二区| 欧美另类久久久品| 久久久99免费| 视频精品一区二区| www.亚洲激情.com| 7777精品伊人久久久大香线蕉的 | 久久久99精品久久| 亚洲在线免费播放| 国产v日产∨综合v精品视频| 欧美视频一区二| 久久久久久久久久久久电影| 亚洲精品一二三区| 高清久久久久久| 欧美一区二区福利在线| 亚洲天堂成人网| 国产不卡免费视频| 26uuu精品一区二区在线观看| 一区二区在线看| 国产成人8x视频一区二区| 91精品久久久久久久91蜜桃| 日韩理论电影院| 成人免费毛片高清视频| 亚洲精品一区二区三区在线观看| 亚洲一区欧美一区| 色哟哟欧美精品| 中文字幕 久热精品 视频在线| 久久国产尿小便嘘嘘尿| 精品国产百合女同互慰| 久久国产精品99精品国产| 欧美精品亚洲一区二区在线播放| 一区二区久久久久久| 91美女片黄在线观看91美女| 国产精品视频一二| 91免费版pro下载短视频| 亚洲天堂久久久久久久| 色先锋久久av资源部| 夜色激情一区二区| 欧美日韩不卡视频| 免费看欧美女人艹b| 日韩欧美色电影| 国产精品一区三区| 一区在线观看免费| 欧美视频日韩视频| 美女免费视频一区二区| 久久综合国产精品| 成人自拍视频在线| 亚洲黄色在线视频| 678五月天丁香亚洲综合网| 国精产品一区一区三区mba视频| 久久久久国产精品麻豆| av激情成人网| 亚洲精品第一国产综合野| 色综合久久99| 毛片一区二区三区| 日本一区二区成人| 9191久久久久久久久久久| 国产麻豆精品在线| 五月天久久比比资源色| 国产色一区二区| 欧美日韩精品一区二区三区四区| 蜜臀av一区二区| 亚洲免费观看在线观看| 欧美成人精品二区三区99精品| 成人综合在线观看| 久久不见久久见免费视频1| 亚洲欧美综合网| 日韩免费看网站| 欧美日韩一区二区在线观看| 激情深爱一区二区| 五月综合激情婷婷六月色窝| 久久久99免费| 精品剧情在线观看| 欧美丰满一区二区免费视频| 成人在线综合网| 国内外精品视频| 免费高清在线视频一区·| 亚洲一区二区三区中文字幕| 精品国产一区二区三区av性色 | 日韩理论片中文av| 欧美一区二区三区人| 一本到一区二区三区| 成人性生交大片免费看中文| 久久99国产精品麻豆| 久久成人18免费观看| 青青草国产精品97视觉盛宴| 亚洲大片精品永久免费| 亚洲一区二区四区蜜桃| 一区二区三区在线免费播放 | 美女视频黄 久久| 久久99最新地址| 久久er99精品| 美女一区二区视频| 亚洲国产精品久久不卡毛片| 中文字幕在线一区免费| 中文字幕亚洲区| 亚洲欧洲av另类| 日韩精品一级中文字幕精品视频免费观看 | 国产欧美精品一区aⅴ影院| 欧美国产一区在线| 综合久久久久久| 亚洲成人一区二区| 国产综合色精品一区二区三区| 狠狠色丁香久久婷婷综| 粉嫩久久99精品久久久久久夜| 99热这里都是精品| 欧美日韩一区二区不卡| 久久综合九色综合久久久精品综合| 日本一区二区免费在线观看视频| 欧美国产一区视频在线观看| 亚洲精品久久嫩草网站秘色| 偷拍一区二区三区| 粉嫩欧美一区二区三区高清影视| 色综合夜色一区| 欧美白人最猛性xxxxx69交| 欧美日韩在线播| 久久精品亚洲麻豆av一区二区 | 日韩三级视频中文字幕| 国产精品每日更新在线播放网址| 亚洲最大成人综合| 国产乱子伦一区二区三区国色天香 | 欧美精品久久99久久在免费线 | 91麻豆精品国产| 国产欧美精品一区| 久久精品国产77777蜜臀| 欧美日产在线观看| 中文字幕av免费专区久久| 看片的网站亚洲| 91在线看国产| 中文字幕亚洲在| 成人免费毛片app| 国产日韩欧美精品一区| 久久国产三级精品| 欧美videofree性高清杂交| 亚洲高清不卡在线| 欧美午夜精品一区二区三区 | 偷偷要91色婷婷| 欧美日韩亚洲综合在线| 一区二区三区在线影院| 91在线观看地址| 亚洲图片欧美激情| jlzzjlzz亚洲日本少妇|