Ruby - Tk 指南



引言

Ruby 的標準圖形使用者介面 (GUI) 是 Tk。Tk 最初是 John Ousterhout 開發的 Tcl 指令碼語言的 GUI。

Tk 具有獨特的優勢,它是唯一一個跨平臺的 GUI。Tk 可以在 Windows、Mac 和 Linux 上執行,並在每個作業系統上提供原生外觀和感覺。

基於 Tk 的應用程式的基本元件稱為小部件。元件有時也稱為視窗,因為在 Tk 中,“視窗”和“小部件”通常可以互換使用。

Tk 應用程式遵循小部件層次結構,其中任意數量的小部件可以放置在另一個小部件內,而這些小部件又可以放置在另一個小部件內,以此類推。Tk 程式中的主小部件稱為根小部件,可以透過建立 TkRoot 類的新的例項來建立。

  • 大多數基於 Tk 的應用程式都遵循相同的迴圈:建立小部件,將它們放置在介面中,最後將與每個小部件關聯的事件繫結到方法。

  • 有三個幾何管理器;place、gridpack 負責控制介面中每個小部件的大小和位置。

安裝

Ruby Tk 繫結與 Ruby 一起分發,但 Tk 是單獨安裝的。Windows 使用者可以從 ActiveState 的 ActiveTcl 下載一鍵式 Tk 安裝程式。

Mac 和 Linux 使用者可能不需要安裝它,因為很有可能它已經隨作業系統一起安裝了,但如果沒有,您可以下載預構建的軟體包或從 Tcl 開發者交流 獲取原始碼。

簡單的 Tk 應用程式

Ruby/Tk 程式的典型結構是建立主視窗或視窗(TkRoot 的例項),向其中新增小部件以構建使用者介面,然後透過呼叫Tk.mainloop啟動主事件迴圈。

Ruby/Tk 的傳統Hello, World!示例如下所示:

require 'tk'

root = TkRoot.new { title "Hello, World!" }
TkLabel.new(root) do
   text 'Hello, World!'
   pack { padx 15 ; pady 15; side 'left' }
end
Tk.mainloop

在這裡,載入 tk 擴充套件模組後,我們使用TkRoot.new建立一個根級框架。然後,我們建立一個TkLabel小部件作為根框架的子項,為標籤設定多個選項。最後,我們打包根框架並進入主 GUI 事件迴圈。

如果執行此指令碼,將產生以下結果:

Ruby/Tk Hello World

Ruby/Tk 小部件類

這是一個各種 Ruby/Tk 類的列表,可以使用它們來使用 Ruby/Tk 建立所需的 GUI。

標準配置選項

所有小部件都有一些不同的配置選項,這些選項通常控制它們如何顯示或如何工作。可用的選項當然取決於小部件類。

這是一個所有標準配置選項的列表,這些選項可能適用於任何 Ruby/Tk 小部件。

Ruby/Tk 幾何管理

幾何管理處理根據需要定位不同的部件。Tk中的幾何管理依賴於主部件和從部件的概念。

主部件是一個部件,通常是頂級視窗或框架,它將包含其他部件,這些部件稱為從部件。您可以將幾何管理器視為控制主部件並決定將在其中顯示的內容。

幾何管理器將詢問每個從部件其自然大小,或者它理想情況下希望顯示多大。然後,它將獲取該資訊並將其與程式在要求幾何管理器管理該特定從部件時提供的任何引數相結合。

有三個幾何管理器place、gridpack負責控制介面中每個部件的大小和位置。

  • grid 將部件排列在網格中的幾何管理器。

  • pack 在空腔邊緣周圍打包的幾何管理器。

  • place 用於固定或橡膠片放置的幾何管理器。

Ruby/Tk 事件處理

Ruby/Tk 支援事件迴圈,它接收來自作業系統的事件。這些事件包括按鈕按下、按鍵、滑鼠移動、視窗調整大小等等。

Ruby/Tk負責為您管理此事件迴圈。它將確定事件適用的部件(使用者單擊此按鈕了嗎?如果按下了鍵,哪個文字框獲得了焦點?),並相應地分派它。各個部件知道如何響應事件,例如,當滑鼠移到按鈕上時,按鈕可能會更改顏色,而當滑鼠離開時,按鈕會恢復原狀。

在更高層次上,Ruby/Tk 呼叫程式中的回撥以指示部件發生了一些重要事件。對於這兩種情況,您可以提供一個程式碼塊或一個Ruby Proc物件,該物件指定應用程式如何響應事件或回撥。

讓我們來看看如何使用bind方法將基本的視窗系統事件與處理它們的Ruby過程關聯起來。bind的最簡單的形式將指示事件名稱的字串和Tk用於處理事件的程式碼塊作為輸入。

例如,要捕獲某些部件上第一個滑鼠按鈕的ButtonRelease事件,您可以編寫:

someWidget.bind('ButtonRelease-1') {
   ....code block to handle this event...
}

事件名稱可以包含其他修飾符和詳細資訊。修飾符是一個字串,例如ShiftControlAlt,表示按下了其中一個修飾鍵。

例如,要捕獲使用者按住Ctrl鍵並單擊右滑鼠按鈕時生成的事件。

someWidget.bind('Control-ButtonPress-3', proc { puts "Ouch!" })

許多Ruby/Tk部件在使用者啟用它們時可以觸發回撥,您可以使用command回撥來指定在發生這種情況時呼叫某個程式碼塊或過程。如前所述,您可以在建立部件時指定命令回撥過程:

helpButton = TkButton.new(buttonFrame) {
   text "Help"
   command proc { showHelp }
}

或者您可以使用部件的command方法稍後分配它:

helpButton.command proc { showHelp }

由於command方法接受過程或程式碼塊,您也可以將前面的程式碼示例編寫為:

helpButton = TkButton.new(buttonFrame) {
   text "Help"
   command { showHelp }
}

configure 方法

configure方法可用於設定和檢索任何部件配置值。例如,要更改按鈕的寬度,您可以隨時呼叫configure方法,如下所示:

require "tk"

button = TkButton.new {
   text 'Hello World!'
   pack
}
button.configure('activebackground', 'blue')
Tk.mainloop

要獲取當前部件的值,只需不提供值即可,如下所示:

color = button.configure('activebackground')

您也可以不帶任何選項呼叫configure,這將為您提供所有選項及其值的列表。

cget 方法

為了簡單地檢索選項的值,configure返回的資訊比您通常想要的多。cget方法只返回當前值。

color = button.cget('activebackground')
廣告
© . All rights reserved.