Ruby-tk-menu
Ruby/TK-メニューウィジェット
説明
- メニュー*は、1行以上の列に配置された1行のエントリのコレクションを表示するウィジェットです。 いくつかの異なるタイプのエントリがあり、それぞれ異なるプロパティがあります。 さまざまなタイプのエントリを1つのメニューにまとめることができます。 メニューエントリは、エントリウィジェットとは異なります。 実際、メニューエントリは個別のウィジェットではありません。メニュー全体が1つのウィジェットです。
最初に作成されたとき、新しいリストボックスには要素がありません。 要素は、提供されたメソッドを使用して追加または削除できます。 さらに、リストされた項目から1つ以上の要素を選択できます。
リストボックスウィンドウにすべての要素を一度に表示する必要はありません。 リストボックスでは、標準の_xscrollcommand_および_yscrollcommand_オプションを使用して両方向にスクロールできます。
構文
このウィジェットを作成する簡単な構文は次のとおりです-
TkMenu.new(root) {
.....Standard Options....
.....Widget-specific Options....
}
標準オプション
- アクティブ
- バックグラウンド
- 無効
- 安心
- activeborderwidth
- ボーダー幅
- font
- フォーカス
- アクティブ
- カーソル *前景
これらのオプションは前の章で説明されています。
ウィジェット固有のオプション
Sr.No. | Options & Description |
---|---|
1 |
このオプションを指定すると、メニューがポストされるたびに実行されるコールバックが提供されます。 コールバックは、メニューを投稿する前にpostメソッドによって呼び出されます。 |
2 |
チェックボタンまたはラジオボタンであるメニューエントリの場合、このオプションは、チェックボタンまたはラジオボタンが選択されたときにインジケーターに表示する色を指定します。 |
3 |
このオプションには、メニューの先頭にティアオフエントリを含めるかどうかを指定する適切なブール値が必要です。 その場合、メニューのエントリ0として存在し、他のエントリは1から始まります。 デフォルトのメニューバインディングは、ティアオフエントリが呼び出されたときにメニューがティアオフされるように調整します。 |
4 |
このオプションに空でない値がある場合、メニューがティアオフされるたびに呼び出すRuby/Tkコールバックを指定します。 実際のコマンドは、このオプションの値、スペース、メニューウィンドウの名前、スペース、引き裂かれたメニューウィンドウの名前の順になります。 たとえば、オプションが「a b」で、メニュー.x.yが切り離されて新しいメニュー.x.tearoff1が作成された場合、コマンド「a b .x.y .x.tearoff1」が呼び出されます。 |
5 |
文字列は、このメニューが切り離されたときに作成されたウィンドウにタイトルを付けるために使用されます。 タイトルがNULLの場合、ウィンドウには、メニューボタンのタイトルまたはこのメニューが呼び出されたカスケード項目のテキストが表示されます。 |
6 |
このオプションは、 menubar 、 tearoff 、または normal のいずれかであり、メニューの作成時に設定されます。 |
メニューの操作
メニューで遊ぶにはさまざまな方法があります-
- * activate(index)メソッドは、_index_で示されるエントリの状態を *active に変更し、アクティブな色を使用して再表示するために使用されます。
- * add(type、?option、value、option、value、…?)メソッドは、メニューの下部に新しいエントリを追加するために使用されます。 新しいエントリのタイプは_type_で指定され、 *cascade 、 checkbutton 、 command 、 radiobutton 、 separator のいずれか、または上記の一意の省略形でなければなりません。
- * delete(index1 ?, index2?)*メソッドを使用して、_index1_から_index2_までのすべてのメニューエントリを削除します。 _index2_を省略すると、デフォルトで_index1_になります。
- * index(index)メソッドは、_index_に対応する数値インデックス、または_index_が *none として指定されている場合は none を返します。
- * insert(index、type ?, option ⇒ value、…?)メソッドは、末尾に追加する代わりに、index_で指定されたエントリの直前に新しいエントリを挿入することを除いて、 *add メソッドと同じです。メニューの。 _type _、 option_、および_value_引数の解釈は、 add ウィジェットメソッドの場合と同じです。
- * invoke(index)*メソッドは、メニューエントリのアクションを呼び出すために使用されます。
- * post(x、y)*メソッドは、xおよびyで指定されたルートウィンドウ座標で画面にメニューが表示されるように調整するために使用されます。
- * postcascade(index)*メソッドは、_index_で指定されたカスケードエントリに関連付けられたサブメニューを投稿し、以前に投稿されたサブメニューの投稿を取り消します。
- * type(index)メソッドは、_index_で指定されたメニューエントリのタイプを返します。 これは、エントリの作成時に *add ウィジェットメソッドに渡される_type_引数です( command または separator 、またはティアオフエントリの tearoff など)。
- unpost メソッドは、ウィンドウのマッピングを解除して、表示されないようにします。 下位レベルのカスケードメニューが投稿されている場合は、そのメニューを投稿解除します。 空の文字列を返します。
- * yposition(index)*メソッドは、_index_で指定されたエントリの最上位ピクセルのメニューウィンドウ内のy座標を示す10進数文字列を返します。
メニュー構成
デフォルトのバインディングは、メニューを使用する4つの異なる方法をサポートしています-
- プルダウンメニュー-これは最も一般的なケースです。 最上位のメニューごとに1つのmenubuttonウィジェットを作成し、通常、メニューバーウィンドウの行に一連のメニューボタンを配置します。 また、トップレベルメニューとカスケードサブメニューを作成し、それらを menubuttons の_menu_オプションおよびカスケードメニューエントリと結び付けます。
- ポップアップメニュー-ポップアップメニューは通常、マウスボタンの押下またはキーストロークに応答して送信されます。 ポップアップメニューとカスケードサブメニューを作成し、適切なタイミングで Popup メソッドを呼び出してトップレベルメニューをポストします。
- オプションメニュー-オプションメニューは、いくつかの値のいずれかを選択できるメニューが関連付けられたメニューボタンで構成されています。 現在の値はメニューボタンに表示され、グローバル変数にも保存されます。 Optionmenu クラスを使用して、オプションメニューボタンとそのメニューを作成します。
- 引き裂かれたメニュー-引き裂かれたメニューを作成するには、既存のメニューの上部にある引き裂きエントリを呼び出します。 デフォルトのバインディングでは、元のメニューのコピーである新しいメニューが作成され、トップレベルウィンドウとして永続的にポストされたままになります。 切り離されたメニューは、元のメニューとまったく同じように動作します。
イベントバインディング
Ruby/Tkはメニューにクラスバインディングを自動的に作成し、次のデフォルトの動作をメニューに与えます-
- マウスがメニューに入ると、マウスカーソルの下のエントリがアクティブになります。マウスがメニュー内を移動すると、アクティブなエントリが変化してマウスを追跡します。
- マウスがメニューを離れると、メニューからカスケードされたサブメニューにマウスが移動する特別な場合を除き、メニューのすべてのエントリが無効になります。
- メニュー上でボタンが離されると、アクティブなエントリ(存在する場合)が呼び出されます。 メニューは、切り離されたメニューでない限り、ポストも解除します。
- SpaceキーとReturnキーは、アクティブなエントリを呼び出し、メニューの投稿を取り消します。
- メニュー内のいずれかのエントリに underline オプションで下線が引かれた文字がある場合、下線付きの文字のいずれか(または大文字または小文字に相当する)を押すと、そのエントリが呼び出され、メニューがポスト解除されます。
- Escキーは、エントリを呼び出さずに進行中のメニュー選択を中止します。 また、切り離されたメニューでない限り、メニューのポストを解除します。
- 上キーと下キーは、メニューの次に高いまたは低いエントリをアクティブにします。 メニューの一方の端に達すると、アクティブなエントリはもう一方の端に回り込みます。
- 左キーは、左の次のメニューに移動します。 現在のメニューがカスケードサブメニューの場合、サブメニューはポストされず、現在のメニューエントリは親のカスケードエントリになります。 現在のメニューがメニューボタンからポストされたトップレベルのメニューである場合、現在のメニューボタンはポストされず、左側の次のメニューボタンがポストされます。 それ以外の場合、キーは効果がありません。 メニューボタンの左右の順序は、スタックの順序によって決まります。Tkは、一番下のメニューボタン(デフォルトでは最初に作成されたもの)が左側にあると想定しています。
- 右キーは、右の次のメニューに移動します。 現在のエントリがカスケードエントリの場合、サブメニューが表示され、現在のメニューエントリがサブメニューの最初のエントリになります。 それ以外の場合、現在のメニューがメニューボタンから投稿された場合、現在のメニューボタンは投稿されず、右側の次のメニューボタンが投稿されます。
無効なメニューエントリは応答しません。 マウスボタンを押したり放したりしてもアクティブにならず、無視されます。
例
require "tk"
root = TkRoot.new
root.title = "Window"
menu_click = Proc.new {
Tk.messageBox(
'type' => "ok",
'icon' => "info",
'title' => "Title",
'message' => "Message"
)
}
file_menu = TkMenu.new(root)
file_menu.add('command',
'label' => "New...",
'command' => menu_click,
'underline' => 0)
file_menu.add('command',
'label' => "Open...",
'command' => menu_click,
'underline' => 0)
file_menu.add('command',
'label' => "Close",
'command' => menu_click,
'underline' => 0)
file_menu.add('separator')
file_menu.add('command',
'label' => "Save",
'command' => menu_click,
'underline' => 0)
file_menu.add('command',
'label' => "Save As...",
'command' => menu_click,
'underline' => 5)
file_menu.add('separator')
file_menu.add('command',
'label' => "Exit",
'command' => menu_click,
'underline' => 3)
menu_bar = TkMenu.new
menu_bar.add('cascade',
'menu' => file_menu,
'label' => "File")
root.menu(menu_bar)
Tk.mainloop
これは、次の結果を生成します-