Ruby-tk-guide
Ruby-Tkガイド
前書き
Rubyの標準的なグラフィカルユーザーインターフェイス(GUI)はTkです。 Tkは、John Ousterhoutが開発したTclスクリプト言語のGUIとして始まりました。
Tkには、唯一のクロスプラットフォームGUIであるという独自の特徴があります。 TkはWindows、Mac、Linuxで動作し、各オペレーティングシステムでネイティブのルックアンドフィールを提供します。
Tkベースのアプリケーションの基本コンポーネントは、ウィジェットと呼ばれます。 Tkでは、「ウィンドウ」と「ウィジェット」はしばしば同じ意味で使用されるため、コンポーネントはウィンドウとも呼ばれます。
Tkアプリケーションは、任意の数のウィジェットが別のウィジェット内に配置され、それらのウィジェットが別のウィジェット内に無限に配置されるウィジェット階層に従います。 Tkプログラムのメインウィジェットはルートウィジェットと呼ばれ、TkRootクラスの新しいインスタンスを作成することで作成できます。
- ほとんどのTkベースのアプリケーションは同じサイクルに従います。ウィジェットを作成し、インターフェイスに配置し、最後に各ウィジェットに関連付けられたイベントをメソッドにバインドします。
- 3つのジオメトリマネージャーがあります。 place、grid、および_pack_は、インターフェイス内の各ウィジェットのサイズと場所を制御します。
インストール
Ruby TkバインディングはRubyとともに配布されますが、Tkは別個のインストールです。 Windowsユーザーは、http://aspn.activestate.com/ASPN/Downloads/ActiveTcl/[ActiveState’s ActiveTcl]からシングルクリックTkインストールをダウンロードできます。
MacおよびLinuxユーザーは、OSと一緒に既にインストールされている可能性が高いため、インストールする必要はありませんが、インストールされていない場合は、ビルド済みパッケージをダウンロードするか、https://www.tcl.tk/software/からソースを取得できますtcltk/downloadnow84.tml [Tcl Developer Xchange]。
シンプルなTkアプリケーション
Ruby/Tkプログラムの典型的な構造は、メインまたは root ウィンドウ(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ウィジェットクラス
Ruby/Tkを使用して目的のGUIを作成するために使用できる、さまざまなRuby/Tkクラスのリストがあります。
- link:/ruby/ruby_tk_frame [TkFrame]フレームウィジェットを作成および操作します。
- link:/ruby/ruby_tk_button [TkButton]ボタンウィジェットを作成および操作します。
- link:/ruby/ruby_tk_label [TkLabel]ラベルウィジェットを作成および操作します。
- link:/ruby/ruby_tk_entry [TkEntry]エントリウィジェットを作成および操作します。
- link:/ruby/ruby_tk_checkbutton [TkCheckButton]チェックボタンウィジェットを作成および操作します。
- link:/ruby/ruby_tk_radiobutton [TkRadioButton]ラジオボタンウィジェットを作成および操作します。
- link:/ruby/ruby_tk_listbox [TkListbox]リストボックスウィジェットを作成および操作します。
- link:/ruby/ruby_tk_combobox [TkComboBox]リストボックスウィジェットを作成および操作します。
- link:/ruby/ruby_tk_menu [TkMenu]メニューウィジェットを作成および操作します。
- link:/ruby/ruby_tk_menubutton [TkMenubutton]メニューボタンウィジェットを作成および操作します。
- link:/ruby/ruby_tk_messagebox [Tk.messageBox]メッセージダイアログを作成して操作します。
- link:/ruby/ruby_tk_scrollbar [TkScrollbar]スクロールバーウィジェットを作成および操作します。
- link:/ruby/ruby_tk_canvas [TkCanvas]キャンバスウィジェットを作成および操作します。
- link:/ruby/ruby_tk_scale [TkScale]スケールウィジェットを作成および操作します。
- link:/ruby/ruby_tk_text [TkText]テキストウィジェットを作成および操作します。
- link:/ruby/ruby_tk_toplevel [TkToplevel]トップレベルのウィジェットを作成および操作します。
- link:/ruby/ruby_tk_spinbox [TkSpinbox]スピンボックスウィジェットを作成および操作します。
- link:/ruby/ruby_tk_progressbar [TkProgressBar]プログレスバーウィジェットを作成および操作します。
- link:/ruby/ruby_tk_dialogbox [Dialog Box]ダイアログボックスウィジェットを作成および操作します。
- link:/ruby/ruby_tk_notebook [Tk :: Tile :: Notebook]ノートブックのメタファーを使用して、限られたスペースにいくつかのウィンドウを表示します。
- link:/ruby/ruby_tk_paned [Tk :: Tile :: Paned]垂直または水平に積み重ねられた複数のサブウィンドウを表示します。
- link:/ruby/ruby_tk_separator [Tk :: Tile :: Separator]水平または垂直の区切りバーを表示します。 *リンク:/ruby/ruby_tk_fonts_colors_images [Ruby/Tkフォント、色、画像] Ruby/Tkフォント、色、画像について
標準構成オプション
すべてのウィジェットには、多くの異なる構成オプションがあり、一般にそれらの表示方法や動作を制御します。 使用可能なオプションは、もちろんウィジェットクラスによって異なります。
以下は、すべてのRuby/Tkウィジェットに適用できるすべての標準構成オプションのリストです。
____他のウィジェット固有のオプションもあり、それらはウィジェットとともに説明されます。
Sr.No. | Options & Description |
---|---|
1 |
アクティブな要素を描画するときに使用する背景色を指定します。 マウスカーソルが要素上にある場合、要素はアクティブであり、マウスボタンを押すと何らかのアクションが発生します。 「赤」、「青」、「ピンク」、「黄色」などの色の名前を使用できます。 |
2 |
アクティブな要素の周囲に描画される3D境界線の幅を示す負でない値を指定します。 |
3 |
アクティブな要素を描画するときに使用する前景色を指定します。 |
4 |
ウィジェット内の情報の方法を指定します(例: テキストまたはビットマップ)がウィジェットに表示されます。 値 n 、 ne 、 e 、 se 、 s 、 sw 、 w 、 nw 、または center のいずれかでなければなりません。 たとえば、 nw は、左上隅がウィジェットの左上隅になるように情報を表示することを意味します。 |
5 |
ウィジェットを表示するときに使用する通常の背景色を指定します。 |
6 |
ウィジェットに表示するビットマップを指定します。 ビットマップが表示される正確な方法は、アンカーやジャスティファイなどの他のオプションの影響を受ける場合があります。 |
7 |
ウィジェットの外側を囲む3D境界線の幅を示す負でない値を指定します。 |
8 |
ウィジェットがテキストとビットマップ/画像を同時に表示するかどうか、また表示する場合は、ビットマップ/画像をテキストに対して相対的に配置する場所を指定します。 値 none 、 bottom 、 top 、 left 、 right 、または center のいずれかでなければなりません。 |
9 |
ウィジェットに使用されるマウスカーソルを指定します。 可能な値は、「watch」、「arrow」などです。 |
10 |
無効な要素を描画するときに使用する前景色を指定します。 |
11 |
ウィジェット内の選択もX選択にする必要があるかどうかを指定します。 値には、 true 、 false 、 0 、 1 、 yes 、または no のいずれかを指定できます。 選択がエクスポートされた場合、ウィジェットで選択すると現在のX選択が選択解除され、ウィジェットの外部で選択するとウィジェット選択が選択解除され、ウィジェットは選択があると選択取得要求に応答します。 |
12 |
ウィジェット内にテキストを描画するときに使用するフォントを指定します。 |
13 |
ウィジェットを表示するときに使用する通常の前景色を指定します。 |
14 |
ウィジェットに入力フォーカスがない場合に、走査ハイライト領域に表示する色を指定します。 |
15 |
入力フォーカスがあるときにウィジェットの周囲に描画される走査ハイライト長方形に使用する色を指定します。 |
16 |
入力フォーカスがあるときにウィジェットの外側を囲むハイライト長方形の幅を示す負でない値を指定します。 |
17 |
ウィジェットに表示する画像を指定します。これは、画像作成で作成されている必要があります。 通常、画像オプションが指定されている場合は、ビットマップまたはテキスト値を指定してウィジェットに表示する他のオプションをオーバーライドします。画像オプションを空の文字列にリセットして、ビットマップまたはテキスト表示を再度有効にすることができます。 |
18 |
スクロールバーやスケールなど、値を調整するためにドラッグできるスライダーを備えたウィジェットの場合、このオプションは値の変更について通知を行うタイミングを決定します。 オプションの値はブール値でなければなりません。 値がfalseの場合、スライダーをドラッグすると更新が継続的に行われます。 値がtrueの場合、マウスボタンを放してドラッグを終了するまで更新は遅延します。その時点で、単一の通知が行われます。 |
19 |
ウィジェットに複数行のテキストが表示されている場合、このオプションは行が互いにどのように並ぶかを決定します。* left 、 *center 、または right のいずれかでなければなりません。 *左*は行の左端がすべて整列することを意味し、*中央*は行の中心が整列することを意味し、*右*は行の右端が整列することを意味します。 |
20 |
offset ⇒ String タイルのオフセットを指定します( tile オプションも参照)。 2つの異なる形式 offset x、y または offset side を使用できます。sideは n 、 ne 、 e 、 se 、 s 、 sw 、 w 、 nw 、または center 。 |
21 |
スクロールバーなど、水平または垂直の向きでレイアウトできるウィジェットの場合、このオプションは使用する向きを指定します。* horizontal または *vertical のいずれか、またはこれらのいずれかの省略形でなければなりません。 |
22 |
X方向のウィジェットに追加で要求するスペースの量を示す負でない値を指定します。 |
23 |
Y方向のウィジェットに追加で要求するスペースの量を示す負でない値を指定します。 |
24 |
ウィジェットに必要な3D効果を指定します。 許容値は、 raised 、 sunken 、 flat 、 ridge 、および groove です。 |
25 |
自動リピートを開始する前にボタンまたはキーを押し続ける必要があるミリ秒数を指定します。 たとえば、スクロールバーの上矢印と下矢印で使用されます。 |
26 |
|
27 |
選択したアイテムを表示するときに使用する背景色を指定します。 |
28 |
選択したアイテムの周囲に描画する3-D境界線の幅を示す負でない値を指定します。 |
29 |
選択したアイテムを表示するときに使用する前景色を指定します。 |
30 |
このウィジェットがトップレベルウィンドウのサイズ変更グリッドを制御するかどうかを決定するブール値を指定します。 このオプションは通常、ウィジェット内の情報が自然なサイズ(文字のサイズ)であり、ウィンドウの寸法がこれらの単位の整数であることが理にかなっているテキストウィジェットで使用されます。 |
31 |
キーボードトラバーサルを介してウィンドウからウィンドウにフォーカスを移動するときに使用される情報を提供します(TabやShift-Tabなど)。 フォーカスをウィンドウに設定する前に、走査スクリプトは最初にウィンドウが表示可能かどうかを確認します(ウィンドウとそのすべての祖先がマップされます)。そうでない場合、ウィンドウはスキップされます。 値0は、キーボードトラバーサル中にこのウィンドウを完全にスキップすることを意味します。 1は、このウィンドウが常に入力フォーカスを受け取ることを意味します。 |
32 |
ウィジェット内に表示される文字列を指定します。 文字列の表示方法は、特定のウィジェットによって異なり、 anchor や justify などの他のオプションによって決定される場合があります。 |
33 |
textvariable ⇒ Variable 変数の名前を指定します。 変数の値は、ウィジェット内に表示されるテキスト文字列です。変数値が変更されると、ウィジェットは自動的に更新されて新しい値を反映します。 文字列がウィジェットに表示される方法は、特定のウィジェットによって異なり、 anchor や justify などの他のオプションによって決定される場合があります。 |
34 |
ウィジェットの表示に使用される画像を指定します。 画像が空の文字列の場合、通常の背景色が表示されます。 |
35 |
スクロールバーやスケールなどのウィジェットの長方形のトラフ領域に使用する色を指定します。 |
36 |
スクロールバーやスケールなどのウィジェットの長方形のトラフ領域に表示するために使用される画像を指定します。 |
37 |
ウィジェットで下線を引く文字の整数インデックスを指定します。 このオプションは、デフォルトのバインディングで使用され、メニューボタンとメニューエントリのキーボードトラバーサルを実装します。 0はウィジェットに表示されるテキストの最初の文字に対応し、1は次の文字に対応し、以下同様に続きます。 |
38 |
ワードラッピングを実行できるウィジェットの場合、このオプションは最大行長を指定します。 |
39 |
水平スクロールバーとの通信に使用されるコールバックを指定します。 |
40 |
垂直スクロールバーとの通信に使用されるコールバックを指定します。 |
Ruby/Tkジオメトリ管理
ジオメトリ管理は、要件ごとに異なるウィジェットを配置します。 Tkのジオメトリ管理は、マスターウィジェットとスレーブウィジェットの概念に依存しています。
マスターはウィジェットであり、通常はトップレベルのウィンドウまたはフレームであり、スレーブと呼ばれる他のウィジェットが含まれます。 ジオメトリマネージャーは、マスターウィジェットを制御し、表示するものを決定するものと考えることができます。
ジオメトリマネージャは、各スレーブウィジェットにその自然なサイズ、または理想的には表示するサイズを尋ねます。 次に、その情報を取得し、その特定のスレーブウィジェットの管理をジオメトリマネージャーに要求するときに、プログラムによって提供されるパラメーターと組み合わせます。
インターフェース内の各ウィジェットのサイズと場所を制御する3つのジオメトリマネージャー_place、grid 、 pack_があります。
- link:/ruby/ruby_tk_grid [grid]ウィジェットをグリッドに配置するジオメトリマネージャ。
- link:/ruby/ruby_tk_pack [pack]キャビティのエッジの周りをパックするジオメトリマネージャ。 *link:/ruby/ruby_tk_place [place]固定またはラバーシート配置用のジオメトリマネージャー。
Ruby/Tkイベント処理
Ruby/Tkは_event loop_をサポートします。これは、オペレーティングシステムからイベントを受け取ります。 これらは、ボタンを押す、キーストローク、マウスの動き、ウィンドウのサイズ変更などです。
Ruby/Tkがこのイベントループを管理します。 イベントがどのウィジェットに適用されるかがわかります(ユーザーがこのボタンをクリックしましたか? キーが押された場合、どのテキストボックスにフォーカスがありますか?)、それに応じてディスパッチします。 個々のウィジェットはイベントに応答する方法を知っているため、たとえば、マウスがボタンの上を移動するとボタンの色が変わり、マウスが離れると元に戻ります。
より高いレベルでは、Ruby/Tkはプログラムでコールバックを呼び出して、ウィジェットに重大なことが起こったことを示します。いずれの場合も、アプリケーションがイベントまたはコールバックに応答する方法を指定するコードブロックまたは_Ruby Proc_オブジェクトを提供できます。
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ウィジェットは、ユーザーがそれらをアクティブにしたときに_callbacks_をトリガーできます。 前述のように、ウィジェットを作成するときにコマンドコールバックプロシージャを指定できます-
helpButton = TkButton.new(buttonFrame) {
text "Help"
command proc { showHelp }
}
または、ウィジェットの_command_メソッドを使用して、後で割り当てることができます-
helpButton.command proc { showHelp }
コマンドメソッドはプロシージャまたはコードブロックのいずれかを受け入れるため、前のコード例を次のように書くこともできます-
helpButton = TkButton.new(buttonFrame) {
text "Help"
command { showHelp }
}
__ Ruby/Tkアプリケーションで次の基本的なイベントタイプを使用できます-
Sr.No. | Tag & Event Description |
---|---|
1 |
マウスの左ボタンをクリックしました。 |
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')