Ruby-Tkガイド
前書き
Rubyの標準のグラフィカルユーザーインターフェイス(GUI)はTkです。Tkは、JohnOusterhoutによって開発されたTclスクリプト言語のGUIとして始まりました。
Tkには、唯一のクロスプラットフォームGUIであるという独自の特徴があります。TkはWindows、Mac、およびLinuxで実行され、各オペレーティングシステムでネイティブのルックアンドフィールを提供します。
Tkベースのアプリケーションの基本コンポーネントはウィジェットと呼ばれます。Tkでは、「ウィンドウ」と「ウィジェット」が同じ意味で使用されることが多いため、コンポーネントはウィンドウと呼ばれることもあります。
Tkアプリケーションはウィジェット階層に従い、ウィジェットは別のウィジェット内にいくつでも配置でき、それらのウィジェットは別のウィジェット内に無限に配置できます。Tkプログラムのメインウィジェットはルートウィジェットと呼ばれ、TkRootクラスの新しいインスタンスを作成することで作成できます。
ほとんどのTkベースのアプリケーションは同じサイクルに従います。ウィジェットを作成し、それらをインターフェイスに配置し、最後に、各ウィジェットに関連付けられたイベントをメソッドにバインドします。
3つのジオメトリマネージャがあります。インターフェイス内の各ウィジェットのサイズと場所を制御する役割を担う場所、グリッド、およびパック。
インストール
Ruby TkバインディングはRubyとともに配布されますが、Tkは別のインストールです。Windowsユーザーは、ActiveStateのActiveTclからシングルクリックのTkインストールをダウンロードできます。
MacおよびLinuxユーザーは、OSと一緒にすでにインストールされている可能性が高いため、インストールする必要がない場合がありますが、インストールされていない場合は、ビルド済みパッケージをダウンロードするか、Tcl DeveloperXchangeからソースを入手できます。
シンプルなTkアプリケーション
Ruby / Tkプログラムの一般的な構造は、メインまたは root ウィンドウ(TkRootのインスタンス)にウィジェットを追加してユーザーインターフェイスを構築し、を呼び出してメインイベントループを開始します Tk.mainloop。
伝統的なHello、World!Ruby / Tkの例は次のようになります-
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ウィジェットクラス
Ruby / Tkを使用して目的のGUIを作成するために使用できるさまざまなRuby / Tkクラスのリストがあります。
TkFrameフレームウィジェットを作成および操作します。
TkButtonボタンウィジェットを作成および操作します。
TkLabelラベルウィジェットを作成および操作します。
TkEntryエントリウィジェットを作成および操作します。
TkCheckButtonチェックボタンウィジェットを作成および操作します。
TkRadioButtonラジオボタンウィジェットを作成および操作します。
TkListboxリストボックスウィジェットを作成および操作します。
TkComboBoxリストボックスウィジェットを作成および操作します。
TkMenuメニューウィジェットを作成および操作します。
TkMenubuttonメニューボタンウィジェットを作成および操作します。
Tk.messageBoxメッセージダイアログを作成および操作します。
TkScrollbarスクロールバーウィジェットを作成および操作します。
TkCanvasキャンバスウィジェットを作成および操作します。
TkScaleスケールウィジェットを作成および操作します。
TkTextテキストウィジェットを作成および操作します。
TkToplevelトップレベルウィジェットを作成および操作します。
TkSpinboxSpinboxウィジェットを作成および操作します。
TkProgressBarプログレスバーウィジェットを作成および操作します。
ダイアログボックスダイアログボックスウィジェットを作成および操作します。
Tk :: Tile :: Notebookノートブックの比喩で限られたスペースにいくつかのウィンドウを表示します。
Tk :: Tile :: Paned垂直または水平に積み重ねられた多数のサブウィンドウを表示します。
Tk :: Tile :: Separator水平または垂直のセパレータバーを表示します。
Ruby / Tkフォント、色、画像Ruby / Tkフォント、色、画像を理解する
標準構成オプション
すべてのウィジェットには、さまざまな構成オプションがあり、通常、ウィジェットの表示方法や動作を制御します。もちろん、使用できるオプションはウィジェットクラスによって異なります。
これは、すべてのRuby / Tkウィジェットに適用できるすべての標準構成オプションのリストです。
シニア番号 | オプションと説明 |
---|---|
1 | activebackground =>文字列 アクティブな要素を描画するときに使用する背景色を指定します。マウスカーソルが要素の上にある場合、要素はアクティブであり、マウスボタンを押すと何らかのアクションが発生します。「赤」、「青」、「ピンク」、「黄色」などの色の名前を使用できます。 |
2 | activeborderwidth =>整数 アクティブな要素の周囲に描画される3D境界線の幅を示す負でない値を指定します。 |
3 | activeforeground =>文字列 アクティブな要素を描画するときに使用する前景色を指定します。 |
4 | anchor =>文字列 ウィジェット内の情報(テキストやビットマップなど)をウィジェットに表示する方法を指定します。値の1つである必要がありますn、 ne、 e、 se、 s、 sw、 w、 nw、または center。例えば、nw は、左上隅がウィジェットの左上隅になるように情報を表示することを意味します。 |
5 | background or bg =>文字列 ウィジェットを表示するときに使用する通常の背景色を指定します。 |
6 | bitmap =>ビットマップ ウィジェットに表示するビットマップを指定します。ビットマップが表示される正確な方法は、アンカーや位置揃えなどの他のオプションの影響を受ける可能性があります。 |
7 | borderwidth or bd =>整数 ウィジェットの外側に描画する3D境界線の幅を示す負でない値を指定します。 |
8 | compound =>文字列 ウィジェットがテキストとビットマップ/画像を同時に表示するかどうかを指定し、表示する場合は、ビットマップ/画像をテキストに対してどこに配置するかを指定します。値の1つである必要がありますnone、 bottom、 top、 left、 right、または center。 |
9 | cursor =>文字列 ウィジェットに使用するマウスカーソルを指定します。可能な値は、「watch」、「arrow」などです。 |
10 | disabledforeground =>文字列 無効な要素を描画するときに使用する前景色を指定します。 |
11 | exportselection =>ブール値 ウィジェット内の選択がX選択でもあるかどうかを指定します。値には、true、 false、 0、 1、 yes、または no。選択範囲がエクスポートされる場合、ウィジェット内で選択すると現在のX選択範囲の選択が解除され、ウィジェットの外側を選択するとウィジェット選択範囲の選択が解除され、ウィジェットは選択範囲がある場合に選択取得要求に応答します。 |
12 | font =>文字列 ウィジェット内にテキストを描画するときに使用するフォントを指定します。 |
13 | foreground or fg =>文字列 ウィジェットを表示するときに使用する通常の前景色を指定します。 |
14 | highlightbackground =>文字列 ウィジェットに入力フォーカスがない場合にトラバーサルハイライト領域に表示する色を指定します。 |
15 | highlightcolor =>文字列 入力フォーカスがあるときにウィジェットの周囲に描画されるトラバーサルハイライト長方形に使用する色を指定します。 |
16 | highlightthickness =>整数 入力フォーカスがあるときにウィジェットの外側に描画するハイライト長方形の幅を示す負でない値を指定します。 |
17 | image =>画像 ウィジェットに表示する画像を指定します。画像の作成で作成されている必要があります。通常、imageオプションが指定されている場合、ウィジェットに表示するビットマップまたはテキスト値を指定する他のオプションをオーバーライドします。画像オプションを空の文字列にリセットして、ビットマップまたはテキスト表示を再度有効にすることができます。 |
18 | jump =>文字列 スクロールバーやスケールなど、ドラッグして値を調整できるスライダーを備えたウィジェットの場合、このオプションは、値の変更について通知が行われるタイミングを決定します。オプションの値はブール値でなければなりません。値がfalseの場合、スライダーをドラッグすると更新が継続的に行われます。値がtrueの場合、マウスボタンを離してドラッグを終了するまで更新が遅延されます。その時点で、単一の通知が行われます。 |
19 | justify =>文字列 ウィジェットに複数行のテキストが表示されている場合、このオプションは、行が互いにどのように整列するかを決定します。のいずれかである必要がありますleft、 center、または right。 Left 線の左端がすべて整列することを意味します。 center 線の中心が整列していることを意味し、 right 線の右端が揃うことを意味します。 |
20 | offset =>文字列 タイルのオフセットを指定します(「 tileオプション)。それは2つの異なるフォーマットを持つことができますoffset x,y または offset side、サイドができる場所 n、 ne、 e、 se、 s、 sw、 w、 nw、または center。 |
21 | orient =>文字列 スクロールバーなど、水平方向または垂直方向のいずれかでレイアウトできるウィジェットの場合、このオプションは使用する方向を指定します。どちらかでなければなりませんhorizontal または vertical またはこれらのいずれかの略語。 |
22 | padx =>整数 X方向にウィジェットに要求する追加スペースの量を示す負でない値を指定します。 |
23 | pady =>整数 Y方向にウィジェットに要求する追加スペースの量を示す負でない値を指定します。 |
24 | relief =>整数 ウィジェットに必要な3D効果を指定します。許容値はraised、 sunken、 flat、 ridge、および groove。 |
25 | repeatdelay =>整数 自動リピートを開始する前にボタンまたはキーを押し続ける必要があるミリ秒数を指定します。たとえば、スクロールバーの上矢印と下矢印に使用されます。 |
26 | repeatinterval =>整数 と組み合わせて使用 repeatdelay:自動リピートが開始されると、このオプションは自動リピート間のミリ秒数を決定します |
27 | selectbackground =>文字列 選択したアイテムを表示するときに使用する背景色を指定します。 |
28 | selectborderwidth =>整数 選択したアイテムの周囲に描画する3D境界線の幅を示す負でない値を指定します。 |
29 | selectforeground =>文字列 選択したアイテムを表示するときに使用する前景色を指定します。 |
30 | setgrid =>ブール値 このウィジェットがトップレベルウィンドウのサイズ変更グリッドを制御するかどうかを決定するブール値を指定します。このオプションは通常、テキストウィジェットで使用されます。ウィジェット内の情報は自然なサイズ(文字のサイズ)であり、ウィンドウのサイズがこれらの単位の整数であることが理にかなっています。 |
31 | takefocus =>整数 キーボードトラバーサル(TabやShift-Tabなど)を介してフォーカスをウィンドウからウィンドウに移動するときに使用される情報を提供します。ウィンドウにフォーカスを設定する前に、トラバーサルスクリプトは、最初にウィンドウが表示可能かどうかを確認します(ウィンドウとそのすべての祖先がマップされます)。そうでない場合、ウィンドウはスキップされます。値0は、キーボードトラバーサル中にこのウィンドウを完全にスキップする必要があることを意味します。1は、このウィンドウが常に入力フォーカスを受け取る必要があることを意味します。 |
32 | text =>文字列 ウィジェット内に表示する文字列を指定します。文字列の表示方法は特定のウィジェットによって異なり、次のような他のオプションによって決定される場合があります。anchor または justify。 |
33 | textvariable =>変数 変数の名前を指定します。変数の値は、ウィジェット内に表示されるテキスト文字列です。変数値が変更されると、ウィジェットは自動的に更新されて新しい値を反映します。文字列がウィジェットに表示される方法は、特定のウィジェットによって異なり、次のような他のオプションによって決定される場合があります。anchor または justify。 |
34 | tile =>画像 ウィジェットの表示に使用する画像を指定します。画像が空の文字列の場合、通常の背景色が表示されます。 |
35 | troughcolor =>文字列 スクロールバーやスケールなどのウィジェットの長方形のトラフ領域に使用する色を指定します。 |
36 | troughtile =>画像 スクロールバーやスケールなどのウィジェットの長方形のトラフ領域に表示するために使用される画像を指定します。 |
37 | underline =>整数 ウィジェットで下線を引く文字の整数インデックスを指定します。このオプションは、メニューボタンとメニューエントリのキーボードトラバーサルを実装するためにデフォルトのバインディングで使用されます。0はウィジェットに表示されるテキストの最初の文字に対応し、1は次の文字に対応します。 |
38 | wraplength =>整数 ワードラップを実行できるウィジェットの場合、このオプションは最大行長を指定します。 |
39 | xscrollcommand =>関数 水平スクロールバーとの通信に使用されるコールバックを指定します。 |
40 | yscrollcommand =>関数 垂直スクロールバーとの通信に使用されるコールバックを指定します。 |
Ruby / Tkジオメトリ管理
ジオメトリ管理では、要件に応じてさまざまなウィジェットを配置します。Tkのジオメトリ管理は、マスターウィジェットとスレーブウィジェットの概念に依存しています。
マスターはウィジェットであり、通常はトップレベルのウィンドウまたはフレームであり、スレーブと呼ばれる他のウィジェットが含まれます。ジオメトリマネージャーは、マスターウィジェットを制御し、その中に何を表示するかを決定するものと考えることができます。
ジオメトリマネージャは、各スレーブウィジェットに、その自然なサイズ、または理想的に表示するサイズを尋ねます。次に、その情報を取得し、ジオメトリマネージャにその特定のスレーブウィジェットを管理するように要求するときに、プログラムによって提供されるパラメータと組み合わせます。
インターフェイス内の各ウィジェットのサイズと場所を制御する3つのジオメトリマネージャーの配置、グリッド、およびパックがあります。
ウィジェットをグリッドに配置するグリッドジオメトリマネージャー。
キャビティのエッジの周りにパックするジオメトリマネージャをパックします。
場所の固定またはゴムシート配置のためのジオメトリマネージャ。
Ruby / Tkイベント処理
Ruby / Tkは、オペレーティングシステムからイベントを受信するイベントループをサポートしています。これらは、ボタンの押下、キーストローク、マウスの動き、ウィンドウのサイズ変更などです。
Ruby / Tkが、このイベントループの管理を担当します。イベントが適用されるウィジェットを特定し(ユーザーがこのボタンをクリックしたかどうか、キーが押された場合、どのテキストボックスにフォーカスがあったか)、それに応じてディスパッチします。個々のウィジェットはイベントへの応答方法を知っているため、たとえば、マウスがボタンの上に移動するとボタンの色が変わり、マウスが離れると元に戻る場合があります。
より高いレベルでは、Ruby / Tkはプログラムでコールバックを呼び出して、ウィジェットに何か重要なことが起こったことを示します。どちらの場合でも、アプリケーションがイベントまたはコールバックにどのように応答するかを指定するコードブロックまたはRubyProcオブジェクトを提供できます。
bindメソッドを使用して、基本的なウィンドウシステムイベントをそれらを処理するRubyプロシージャに関連付ける方法を見てみましょう。最も単純な形式のバインドは、入力として、イベント名を示す文字列と、Tkがイベントを処理するために使用するコードブロックを取ります。
たとえば、ウィジェットの最初のマウスボタンのButtonReleaseイベントをキャッチするには、次のように記述します。
someWidget.bind('ButtonRelease-1') {
....code block to handle this event...
}
イベント名には、追加の修飾子と詳細を含めることができます。修飾子は、Shift、Control、Altなどの文字列であり、修飾子キーの1つが押されたことを示します。
したがって、たとえば、ユーザーがCtrlキーを押しながらマウスの右ボタンをクリックしたときに生成されるイベントをキャッチします。
someWidget.bind('Control-ButtonPress-3', proc { puts "Ouch!" })
多くのRuby / Tkウィジェットは、ユーザーがウィジェットをアクティブ化したときにコールバックをトリガーできます。コマンドコールバックを使用して、特定のコードブロックまたはプロシージャが発生したときに呼び出されるように指定できます。前に見たように、ウィジェットを作成するときにコマンドコールバックプロシージャを指定できます-
helpButton = TkButton.new(buttonFrame) {
text "Help"
command proc { showHelp }
}
または、ウィジェットのコマンドメソッドを使用して後で割り当てることができます-
helpButton.command proc { showHelp }
コマンドメソッドはプロシージャまたはコードブロックのいずれかを受け入れるため、前のコード例を次のように記述することもできます。
helpButton = TkButton.new(buttonFrame) {
text "Help"
command { showHelp }
}
シニア番号 | タグとイベントの説明 |
---|---|
1 | "1" (one) マウスの左ボタンをクリックしました。 |
2 | "ButtonPress-1" マウスの左ボタンをクリックしました。 |
3 | "Enter" マウスを内側に移動しました。 |
4 | "Leave" マウスを外側に移動しました。 |
5 | "Double-1" ダブルクリックしました。 |
6 | "B3-Motion" 右ボタンをある位置から別の位置にドラッグします。 |
7 | Control-ButtonPress-3 Ctrlキーとともに右ボタンを押します。 |
8 | Alt-ButtonPress-1 Altキーと一緒にボタンを押します。 |
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')