亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Ruby > 正文

進行GTK之Ruby GUI編程的基本方法

2020-02-24 15:36:23
字體:
供稿:網(wǎng)友

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

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

?
?
這樣,我們就可以從代碼中一下子看出UI布局了。
?
builder風格的代碼和HTML很類似,對于熟悉HTML的web界面設(shè)計者來說,可視化的編輯器并沒有多大的必要。
?
?
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)建一個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行不到的代碼,我經(jīng)常是直接拷貝到項目中使用。后來逐漸添了些功能,覺得它變得更有用了,于是便發(fā)布到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??
?
20151214173039560.png (266×58)?
從上面的例子中可以看出,GtkSimpleLayout并沒有改變RubyGnome2程序的主框架,它只是一個擴充。
?
?
屬性設(shè)置
在放置UI元件的時候,往往需要設(shè)置初始屬性,或者要指定布局參數(shù)。GtkSimpleLayout用Hash來傳遞這些屬性與參數(shù),例如:
?

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

20151214173108985.png (437×62)

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

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

20151214173136286.png (238×58)

這個時候,可以用"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

? 20151214173231646.png (211×143)

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

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

?
之后,可以用component()函數(shù)取得這個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 

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

require 'gtk2' require 'simple_layout'  class MyWin < Gtk::Window  include SimpleLayout::Base  def initialize   super   add my_layout   register_auto_events() # 注冊自動事件響應(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 

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

20151214173350854.png (307×219)

Enjoy it :-)

以上就是進行GTK之Ruby GUI編程的基本方法,相信現(xiàn)在大家都有了更加清晰的了解了吧?如果你還想了解更多的知識,建議你來武林技術(shù)頻道網(wǎng)站學習吧。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

亚洲精选视频免费看| 日本二区在线观看| 亚洲欧美国产一本综合首页| 四虎中文字幕| 麻豆视频在线观看免费网站黄| 99久久国产综合精品色伊| 国产日韩av网站| 91九色在线视频| 一区精品在线观看| 久久久久国产免费免费| 91麻豆精品国产91久久久资源速度| 国产欧美亚洲一区| 午夜精品久久久久久久91蜜桃| 日韩久久一区| 午夜一区二区三区四区| 四虎海外永久免费网址| 亚洲精品一二三四| 久久夜色精品亚洲| 自拍偷拍亚洲色图欧美| 久久久久99精品成人片三人毛片| 少妇一区视频| 久久精品嫩草影院| 日本一区二区三区免费乱视频| 久久中文字幕一区二区三区| 国产免费www| 欧美少妇xxx| 欧美久久一二区| 久久精品人人做| 性国产高清在线观看| 久久99精品久久久久子伦| 天天射狠狠干| 四虎精品成人免费观看| 97在线视频精品| 69影院欧美专区视频| 国产国语刺激对白av不卡| 欧美亚洲视频在线观看| 精品久久不卡| 国产精品一码二码三码在线| 亚洲跨种族黑人xxx| 成人激情视频在线观看| 少妇无码av无码专区在线观看| 伊人久久久久久久久久久久久久| 亚洲精品国产一区黑色丝袜| 欧美理论电影| 国产日韩精品一区二区三区在线| 国产成人精品一区二三区| 日产国产欧美视频一区精品| 嫩草av久久伊人妇女超级a| 欧美国产日韩精品免费观看| 日韩精品久久久久久久电影99爱| 国产高清免费在线播放| 印度午夜性春猛xxx交| 久久夜色精品| 国产欧美一区二区三区在线看蜜臀| 久久久久国内| 久久久久成人精品免费播放动漫| 黄色成人在线免费观看| 欧美老妇交乱视频| 天天综合网网欲色| 欧美熟妇交换久久久久久分类| 一本久久知道综合久久| 色偷偷精品视频在线播放| 久久久久亚洲精品| 欧美色电影在线| 最近国产精品视频| 人人精品视频| 秋霞一区二区三区| 国产亚洲女人久久久久毛片| 免费黄色av网站| 37p粉嫩大胆色噜噜噜| 免费永久视频| 国产亚洲一级高清| 精品无人区乱码1区2区3区在线| 永久免费的av网站| 国产伦精品一区二区三区视频| 国产伪娘ts一区| 尤物视频在线视频| 国产裸体美女永久免费无遮挡| 视频在线精品一区| 亚洲综合精品久久| 日韩成人在线电影| 性欧美xxxx| 亚洲第一精品自拍| 亚洲不卡中文字幕| 四虎永久免费网站| 婷婷国产成人久久精品激情| 亚洲综合第一页| 亚洲第一页视频| brazzers欧美精品| 欧美最猛黑人xxxx黑人猛交黄| 午夜网站在线观看| 91超碰在线免费观看| 亚洲国产精品成人综合久久久| 在线观看制服搞黄视频| 国产一区二区观看| 亚洲最新视频在线播放| 久久人人爽人人爽人人片av免费| 干b视频在线观看| 中文字幕av免费| 91啦中文在线观看| 天堂av8在线| 亚洲精品影院| 91福利在线免费| 色哟哟国产精品色哟哟| 日韩视频免费观看高清| 另类ts人妖一区二区三区| 欧亚乱熟女一区二区在线| 日韩欧美天堂| 91久久国产综合久久91猫猫| 欧美电影一区二区| 99视频在线精品国自产拍免费观看| 如如影视在线观看经典| 日韩视频一区二区| h在线观看免费| 欧美亚洲免费在线一区| 在线视频欧美一区| 国产一区二区三区四区大秀| 亚洲网站在线| 成人在线免费观看av| 在线观看av网站| 国产又粗又大又长| 日本在线中文字幕一区| 国产拍欧美日韩视频二区| 男人天堂免费视频| 久久人人爽国产| 电影午夜精品一区二区三区| 国产精品亚洲综合久久小说| 色88888久久久久久影院按摩| 欧美va天堂va视频va在线| 国产精品主播| 国产在线一在线二| 欧美激情第10页| 日本精品一区二区三区四区| 在线观看一区日韩| 亚洲男人天堂2024| 日本在线免费观看| 日本韩国福利视频| 99热国内精品永久免费观看| 国产精品久久久久久一区二区三区| 激情综合网婷婷| 亚洲影院天堂中文av色| 国产成人精品视频免费| 美女被内谢流白浆高视频| 青青青在线免费观看| 懂色av中文字幕一区二区三区| 老司机福利av| b站大片免费直播| 日韩一区精品视频| 亚洲人成网站在线播| 日本丰满少妇黄大片在线观看| 国产精品igao视频网网址不卡日韩| 正在播放一区| 亚洲电影av在线| 先锋影音av资源在线| 在线毛片网站| 亚洲午夜久久久| 黄页网站大全在线免费观看| 中文天堂在线资源| 中文字幕一区二区三区精华液| 台湾佬美性中文| 一区二区三区av在线| 亚洲开心激情| 2020最新国产精品| 亚洲国产精品va在线看黑人| 麻豆精品国产91久久久久久| 欧美网站在线观看| 中文字幕自拍vr一区二区三区| 熟女视频一区二区三区| 国产v片在线观看| 国产在线高清精品| 亚洲国产第一页| 国产午夜精品理论片| 国产小视频在线看| 四季av综合网站| 国自产拍在线网站网址视频| 日韩一区国产在线观看| 老司机性视频| 欧美极品美女视频网站在线观看免费| 成人女保姆的销魂服务| 综合干狼人综合首页| 中文字幕 欧美 日韩| 久久久久久久久久久久久女过产乱| 国产日韩欧美精品一区二区三区| 国产手机视频一区二区| 高h视频在线播放| 国产孕妇孕交大片孕| 国产在线黄色片| 欧美不卡激情三级在线观看| www视频在线免费观看| 日韩av免费大片| 欧美国产一区二区三区激情无套| 久久99国产精品久久99小说| www.久久撸.com| 7777精品久久久久久| 激情视频在线观看| 国产一区二区导航在线播放| 久久理论电影网| 最近免费中文字幕中文高清百度| 最近中文字幕在线6| 日本视频中文字幕一区二区三区| 欧美视频一区二区| 一区二区三区日韩在线观看| 成av人片一区二区| 免费日韩一区二区| 国产ts在线观看| 亚洲嫩模一区| 亚洲国产成人综合| 久草视频免费在线| 亚洲精品短视频| chinese麻豆新拍video| 欧美精品一区二区在线观看| 国产专区精品视频| 播金莲一级淫片aaaaaaa| 国产成人免费在线视频| 久久精品在线观看视频| 日韩欧美电影一区| 麻豆网站免费观看| 欧美黄色网络| 亚洲欧洲美洲综合色网| 阿v免费在线观看| 国产成人午夜视频| 国产无遮挡猛进猛出免费软件| 亚洲欧美一区二区三区四区| 欧美69xx性欧美| 久久久久久久久久久国产| 成人成人成人在线视频| 永久免费不卡在线观看黄网站| 久久99精品国产麻豆婷婷洗澡| 久久99精品久久久久婷婷| 青青草原在线亚洲| 日本激情小视频| 国产亚洲精aa在线看| 欧美www在线| 日韩伦理在线一区| 成全视频在线播放大地| 亚洲综合社区网| 国产综合久久久| 亚洲一区二区三区在线免费| 亚洲最大成人av| 在线看视频你懂的| 亚洲一区不卡| 免费看成人av| 国产中文字幕一区二区三区| 国产精品国产精品国产专区不卡| 免费不卡中文字幕在线| 美乳美女在线观看香蕉| 日韩亚洲欧美一区二区三区| 亚洲欧美网站在线观看| 欧美一级大片在线观看| 首播影院在线观看免费观看电视| 女同性互吃奶乳免费视频| 在线视频日韩| 日韩av一区在线观看| 成人有码在线视频| 熟女俱乐部一区二区| heisi视频网在线观看| 婷婷国产在线| 18一19gay欧美视频网站| 日韩精品成人免费观看视频| 欧美日韩一区二区三区不卡视频| 久久精品视频99| 91麻豆精品国产91久久久更新资源速度超快| 天天干天天曰天天操| 日韩欧美国产wwwww| 日韩精品资源二区在线| 国产91亚洲精品久久久| 国产a视频免费观看| 久久亚洲美女| 欧美另类交人妖| 亚洲mv大片欧洲mv大片精品| 色先锋av资源中文字幕| 久久一级大片| 免费看美女视频在线网站| 欧美二区三区在线| 亚洲国产精品久久久久爰色欲| 99久久免费精品国产免费| 中文字幕在线观看播放| 国产精品久久久久久久妇| 国产成人精品一区二区在线小狼| 在线免费观看麻豆| 欧美午夜无遮挡| 亚洲精品在线看| 婷婷精品国产一区二区三区日韩| 国产69精品久久久久久| 国产亚洲精品美女久久久久久久久久| 久久性感美女视频| 91极品女神在线| 羞羞影院体验区| 日韩免费观看高清完整版在线观看| 亚洲精品一区二区二区| 欧美无人区码suv| 亚洲高清久久久| 久久天天躁狠狠躁老女人| 欧日韩不卡在线视频| 精品日韩在线观看| 777sesese| 制服丝袜av在线| 综合五月激情网| h在线免费观看| 欧美男女爱爱视频| 国产精品精品久久久| 国产精品久久久久久久泡妞| 成人国产精品免费| 日韩亚洲国产中文字幕欧美| juy有坂深雪中文字幕| 成人免费看吃奶视频网站| 欧美电影免费观看高清| 超碰91在线观看| 久久丫精品忘忧草西安产品| 三上悠亚 电影| 精品久久久久久电影| 中文字幕在线观看欧美| 日本xxxxxxxxx18| 精品无码av在线| 中文字幕在线免费| 在线观看免费av网| 国产激情视频一区二区三区欧美| 亚洲视频自拍偷拍| 亚洲天堂av一区二区三区| 91黄色在线观看| 国产农村妇女精品一区| 一级片avav网址| 98视频在线噜噜噜国产| 欧美成在线视频| 1级黄色大片儿| 欧美日韩在线播放一区| 亚洲第一狼人社区| 小泽玛利亚av在线|