|
|
TkDocs_Tk More Widgets. |
H.Kamifuji . |
この章では、リストボックス、スクロールバー、テキスト、プログレスバー、スケール、およびスピンボックスという、いくつかのウィジェットについて紹介します。 これらのうちのいくつかは、以前見た基本的なものより少し強力です。 ここでは、Tk ウィジェットをテーマにしたものを使用していない場合(または必要がない場合)に、Tk ウィジェットを使用する例をいくつか見ていきます。 |
リストボックスは、通常は長時間の単一行のテキスト項目のリストを表示し、ユーザーはリストをブラウズして 1 つ以上を選択できます。 リストボックスは古典的な Tk ウィジェットの一部です。 現在、テーマの Tk ウィジェットセットにリストボックスはありません。 Tk の treeview ウィジェット( themed )はリストボックス( 1 レベルの深いツリー)として使うこともでき、アイコンやスタイルをリストに使うことができます。 また、マルチカラム(テーブル)リストウィジェットは、利用可能な拡張機能の 1 つに基づいて、ある時点でTkに変換される可能性があります。 ![]() perl Tkx : リストボックスは、new_tk__listbox メソッド a.k.a. Tkx::tk__listbox を使用して作成されます。 $parent->new_tk__listbox(-height => 10)Python : リストボックスは、リストボックス機能を使用して作成されます。 l = Listbox(parent, height=10) |
リストボックスに含まれるすべてのアイテムを簡単に埋め込み管理するための簡単な方法と難しい方法があります。 ここに簡単な方法です。各リストボックスには "listvariable" 設定オプションがあり、リストボックスに変数を(リストを保持する必要があります)リンクすることができます。このリストの各要素は、リストボックス内の 1 つの項目を表す文字列です。したがって、リストボックスの項目を追加、削除、または再配置するには、他のリストと同様にこの変数を操作するだけです。同様に、どの項目がリストボックスの 3 行目にあるかを調べるには、リスト変数の 3 番目の要素を調べます。 残念ながら、この "listvariable" パラメータの Perl リストへの参照を渡すことはできません。実際には、Tcl形式のリストが必要です。これは、要素をスペースで区切った文字列であり、最も単純な要素を除くすべてを囲む文字列です。だから、自分で変換する必要があります>。次の例では、かなり単純なリストの変換を処理するシンプルな一行線がありますが、未知のデータの場合は、より堅牢なものが必要です。 Tk 8.3 だけで "listvariable" オプションが導入されたからです。それ以前は、あなたは辛い方法で立ち往生していました。リスト変数を使用すると、すべての標準リスト操作を使用できるので、はるかに簡単なAPIが提供されます。 より古い、より困難なやり方は、アイテムの(内部)リストを操作するリストボックスウィジェット自体の一部であるメソッドのセットを使用することです:
|
最初に決定する必要があるのは、ユーザーが一度に 1 つの項目だけを選択できるか、複数の項目を同時に選択できるかどうかです。これは、"selectmode" オプションによって制御されます。デフォルトでは単一の項目( "browse" )しか選択できませんが、 "extended" の選択モードでは複数の項目を選択できます。 下位互換性の理由から、 "browse" と "extended" という名前は本当にひどいです。これは、使用してはならない "single" と "multiple" の2つのモードがあります(現代のユーザーインターフェイスとプラットフォームの規約に矛盾する古い相互作用スタイルを使用しています)。 ユーザが現在選択しているリストボックス内のアイテムを見つけるには、現在選択されているすべてのアイテムのインデックスのリストを返す "curselection" メソッドを使用します。これは空のリストでもよく、selectmode が "browse" のリストの場合は、1つの項目より長くなることはありません。指定された索引を持つ項目が現在選択されているかどうかをチェックするために、 "select includes index" メソッドを使用することもできます。 プログラムで選択範囲を変更するには、 "selection clear first ?last?" を使用します。メソッドを使用して、単一の項目、または指定されたインデックスの範囲内のいずれかを選択解除できます。項目または範囲内のすべての項目を選択するには、「選択セットを最初から最後に」を使用します。方法。これらの両方は、指定された範囲外の項目の選択には触れません。 選択を変更する場合は、新しく選択した項目がユーザーに表示されていることを確認する必要があります(つまり、表示外にスクロールさ>れていない)。これを行うには、"see index" メソッドを使用します。 ユーザーが選択を変更すると、 "<ListboxSelect>"仮想イベントが生成されます。これにバインドして、必要なアクションをとることができます。アプリケーションによっては、ダブルクリック「ダブル1」イベントにバインドして、現在選択されている項目でアクションを呼び出すこともできます。 |
ほとんどの "classic" Tk ウィジェットと同様に、リストボックスの外観を変更する際に非常に柔軟性があります。 リファレンスマニュアルに記載されているように、リストボックスアイテムが表示されるフォント、アイテムの通常状態、選択時、ウィジェットが無効なときのフォアグラウンド(テキスト)および背景色を変更できます。 また、個々の項目の前景色と背景色を変更できる "itemconfigure" メソッ>ドもあります。 よくあることですが、拘束が便利です。 一般に、デフォルト値は完全に適切であり、プラットフォームの慣習に適しています。 この例では、瞬間的に、これらのオプションの拘束された使用を有効にすることができます。この場合、リストボックスの代替行をわずかに異なる>色で表示します。 |
"listvariable" (または古いものを管理している場合は内部リスト)には、リストボックスに表示される文字列が含まれています。あなたのプログラムの各文字列は他のデータ項目と関連していますが、本当に興味があるのはリストボックスに表示される文字列ではなく、関連するデータ項目です。たとえば、名前を含むリストボックスはユーザーに提示されるものであるかもしれませんが、プログラムは特定の名前ではなく、選択されたユーザーオブジェクト(またはID番号)に本当に関心があります。 この値を表示名にどのように関連付けることができますか?残念なことに、リストボックスウィジェット自体は機能を提供しないので、別に管理する必要があります。明らかなアプローチがいくつかあります。まず、表示された文字列が一意であることが保証されている場合、ハッシュテーブルを使用して名前を関連オブジェクトにマップできます。したがって、名前を指定すると、関連するオブジェクトを簡単に取得できます。これはおそらく名前を書くのにはうまくいかないかもしれませんが、例えば国を選択するためにはうまくいくかもしれません。 2 番目の方法は、リストボックスに表示された文字列のリストと並行して、関連付けられたオブジェクトを保持する2番目のリストを保持することです。したがって、文字列リストの最初の項目はオブジェクトリストの最初の項目に対応し、2 番目の項目は2番目の項目に対応します。 1 つのリスト内で行った変更(挿入、削除、並べ替え)は、他のリストで行う必要があります。リスト内の位置に基づいて、リストアイテムから基になるオブジェクトに簡単にマッピングできます。 |
スクロールバーは、ユーザが別のウィジェットのすべての部分を見るのに役立ちます。その内容は通常、使用可能な画面領域に表示できる内容よりもはるかに大きくなります。![]() perl Tkx : スクロールバーは、new_ttk__scrollbar メソッド a.k.a. Tkx::ttk__scrollbar を使用して作成されます。 $s = $parent->new_ttk__scrollbar(-orient => 'vertical', -command => [$listbox, 'yview']); $listbox->configure(-scrollcommand => [$s, 'set']);Python : スクロールバーは、ttk.Scrollbarコマンドを使用して作成されます。 s = ttk.Scrollbar( parent, orient=VERTICAL, command=listbox.yview) listbox.configure(yscrollcommand=s.set)いくつかのツールキットとは異なり、スクロールバーは別のウィジェット(リストボックスなど)の一部ではありませんが、別々のウィジェットです。代わりに、スクロールバーは、スクロールされたウィジェットのメソッドを呼び出すことによって、スクロールされたウィジェットと通信します。スクロールウィジェットは、スクロールバー上のメソッドを呼び出す必要があります。 最近の Linux ディストリビューションを使用している場合は、多くのアプリケーションで表示されるスクロールバーが、Mac OS X での表示に近いように変更されていることにお気づきでしょう。この新しい外観はまだ Tk ではサポートされていません。 スクロールバーの "orient" 設定オプションは、それが "horizontal" または "vertical" でスクロールするために使用されるかどうかを決定します。スクロールしたウィジェットと通信するには、 "command" 設定オプションを設定する必要があります。これは、スクロールされたウィジェットを呼び出すメソッドである必要があります。 垂直方向にスクロールできるすべてのウィジェットには、 "yview" というメソッドがあります(水平方向にスクロールできるメソッドには "xview" というメソッドがあります)。このメソッドが存在する限り、スクロールバーはスクロールされたウィジェットについて他に何も知る必要はありません。スクロールバーが操作されると、メソッド呼び出しに対するいくつかのパラメータをスクロールし、スクロール方法、位置などを示します。 スクロールされたウィジェットは、スクロールバーに戻ってコミュニケーションを取り、コンテンツ領域全体の何パーセントが現在表示されているかを示します。 yview および/または xview メソッドのほかに、スクロール可能なすべてのウィジェットには、 "yscrollcommand" および/または "xscrollcommand" 設定オプションがあります。これは、スクロールバーの "set" メソッドでなければならないメソッド呼び出しを指定するために使用されます。ここでも、追加のパラメータがメソッド呼び出しに自動的に追加されます。 なんらかの理由でプログラム内からスクロールバーを特定の位置に移動したい場合は、 "set first last" メソッドを自分で呼び出すことができます。 表示されているコンテンツ領域の開始と終了の割合を示す0と1の間の 2 つの値を渡します。 |
リストボックスは、スクロール可能なウィジェットのいくつかのタイプの 1 つです。 ここでは、非常に単純なユーザーインターフェイスを構築します。これは、ウィンドウ全体を占める垂直方向にスクロール可能なリストボックスから構成され、下部にはステータス行だけが表示されます。![]() perl Tkx : use Tkx; my $mw = Tkx::widget->new("."); ($lb = $mw->new_tk__listbox(-height => 5))->g_grid(-column => 0, -row => 0, -sticky => "nwes"); ($s = $mw->new_ttk__scrollbar(-command => [$lb, "yview"], -orient => "vertical"))->g_grid(-column =>1, -row => 0, -sticky => "ns"); $lb->configure(-yscrollcommand => [$s, "set"]); ($mw->new_ttk__label(-text => "Status message here", -anchor => "w"))->g_grid(-column => 0, -row => 1, -sticky => "we"); ($mw->new_ttk__sizegrip)->g_grid(-column => 1, -row => 1, -sticky => "se"); $mw->g_grid_columnconfigure(0, -weight => 1); $mw->g_grid_rowconfigure(0, -weight => 1); for ($i=0; $i < 100; $i++) { $lb->insert("end", "Line " . $i . " of 100"); } Tkx::MainLoop(); ![]() Python : from tkinter import * from tkinter import ttk root = Tk() l = Listbox(root, height=5) l.grid(column=0, row=0, sticky=(N,W,E,S)) s = ttk.Scrollbar(root, orient=VERTICAL, command=l.yview) s.grid(column=1, row=0, sticky=(N,S)) l['yscrollcommand'] = s.set ttk.Sizegrip().grid(column=1, row=1, sticky=(S,E)) root.grid_columnconfigure(0, weight=1) root.grid_rowconfigure(0, weight=1) for i in range(1,101): l.insert('end', 'Line %d of 100' % i) root.mainloop() ![]() ![]() |
私たちは実際には、最後の例であるサイズグリップの新しいウィジェットを覗いています。 これはウィンドウの右下隅にある小さなボックスで、サイズを変更することができます。![]() perl Tkx : SizeGripsは、new_ttk__sizegrip メソッド a.k.a. Tkx::ttk__sizegrip を使用して作成されます。 ($parent->new_ttk__sizegrip)->g_grid(-column => 999, -row => 999, -sticky => "se")Python : SizeGripsは ttk.Sizegrip 関数を使用して作成されます: ttk.Sizegrip(parent).grid(column=999, row=999, sticky=(S,E))いくつかのプラットフォーム( Mac OS X など)では Tk が自動的にサイズグリップを表示しますが、明示的に追加する必要はありません。 後の章で、ウィンドウサイズを変更したり、サイズを変更できるかどうかを判断する方法について説明します。 プラットフォームの規約は、長年にわたるオープンソースの GUI ツールキットよりも進化する傾向があります。 Mac OS X 10.7 では角のサイズグリップがなくなり、ウィンドウの端からリサイズできるようになり、ついには世界の他の部分に追いついた。 したがって、サイズグリップを追加する前に、実行しているオペレーティングシステムのバージョンを確認することをお勧めします。 |
テキストウィジェットは、ユーザーに複数のテキスト行を入力できるように領域を提供します。 テキストウィジェットは古典的なTkウィジェットの一部であり、テーマの Tk ウィジェットではありません。![]() Tk のテキストウィジェットは、キャンバスウィジェットと並んで、驚くほど深くて簡単にプログラミングできる機能を提供する 2 つのウィーバーパワフルウィジェットの 1 つです。 テキストウィジェットは、フルワードプロセッサ、アウトライナー、ウェブブラウザなどの基盤を形成しています。 後の章でいくつかの高度な機能について説明しますが、テキストウィジェットを使用して、かなり単純な複数行のテキスト入力をキャプチャするために必要なものを示します。 perl Tkx : テキストウィジェットは、new_tk__text メソッド a.k.a. Tkx::tk__text を使用して作成されます。 $parent->new_tk__text(-width => 40, -height => 10)Python : テキストウィジェットは、テキスト関数を使用して作成されます。 t = Text(parent, width=40, height=10)"width" と "height" オプションは、テキストウィジェットの要求されたスクリーンサイズをそれぞれ文字と行で指定します。テキストの内容は任意に大きくすることができます。値は "wrap" (折り返しなし、テキストは横スクロール)、 "char" (任意の文字で折り返す)、 "word" (折り返しのみが行われる)のいずれかで、行折り返しの処理方法を制御するために "wrap" 単語境界で発生する)。 テキストウィジェットを無効にすると、編集が行えなくなります。テキストはテーマウィジェットではないため、通常の "state" メソッド と "instate" メソッドは使用できません。代わりに、構成オプション "state" を使用して、 "disabled" または "normal" のいずれかに設定します。 スクロールはリストボックスと同じように動作します。 "xscrollcommand" と "yscrollcommand" の設定オプションは、テキストウィジェットを水平スクロールバーや垂直スクロールバーに付けることができ、 "xview" と "yview" メソッドはスクロールバーから呼び出すことがで>きます。特定の行が表示されている(つまり、表示されていない状態でスクロールされていない)ようにするには、 "see index" メソッドを使用します。index は "line number.character number" の形式です。 5 行目( 1 から始まる)の最初の( 0 から始まる)文字の "5.0" 。 |
テキストウィジェットには、例えばエントリーウィジェットのようなリンク変数は関連付けられていません。 ウィジェット全体のテキスト
コンテンツを取得するには、メソッド "get 1.0 end" を呼び出します。 "1.0" はテキストのインデックスであり、最初の行の最初の文字を意味し、 "end" は最後の文字、最後の行のインデックスのショートカットです。 必要に応じて、より小さな範囲のテキストを取得するために、他のインデックスを渡すことができます。 テキストは "insert index string" メソッドを使用してウィジェットに追加できます。 インデックスは "line.char" の形式であり、テキストが挿入される前の文字をマークします。 "end" を使用してウィジェットの最後にテキストを追加します。 "delete start end" メソッドを使用して、ある範囲のテキストを削除することができます。ここで、開始と終了は既に説明したテキストインデックスです。 テキストウィジェットの多くの追加機能については、後の章で説明します。 |
プログレスバーウィジェットは、長い操作の進行状況をユーザーにフィードバックする方法を提供します。 これは、これを見積もることができるオペレーションのパーセンテージの完全な表示、またはオペレーションが継続していることを示すために変化するが完了の見積もりなしのディスプレイとして行うことができる。![]() perl Tkx : プログレスバーウィジェットは、new_ttk__progressbar メソッド a.k.a. Tkx::ttk__progressbar を使用して作成されます。 $parent->new_ttk__progressbar(-orient => 'horizontal', -length => 200, -mode => 'determinate')Python : プログレスバーウィジェットは、ttk.Progressbar クラスを使用して作成されます。 p = ttk.Progressbar(parent, orient=HORIZONTAL, length=200, mode='determinate')"orient" オプションは、"horizontal" または "vertical" のいずれかです。 水平または垂直プログレスバーの長軸を表す "length" オプションは、画面単位(ピクセルなど)で指定されます。 "mode" 設定オプションは、プログレスバーが完了までの相対的な進捗状況を示す "determinate" 、またはプログラムがどのくらい遠くにあるかを知ることができない "indeterminate" に設定できますが、 物事がまだ実行中であるというフィードバックを提供したい |
確定モードでは、操作がどれだけ進んでいるかについて、ユーザーに多かれ少なかれ正確なフィードバックを提供することができます。こ>れを行うには、まず、プログレスバーにオペレーションの "step" の数を伝えてから、進んでいくうちに、どのくらい進んでいるかを>プログレスバーに伝える必要があります。 "maximum" 構成オプションを使用して、プログレスバーに合計ステップ数を指定することができます。これはデフォルトで 100 になる浮動小数点数です(つまり、各ステップは 1% です)。あなたが進んでいる進行状況を進行状況バーに伝えるために、 "value" 設定オプションを繰り返し変更します。これは 0 から始まり、設定した最大値まで上向きにカウントされます。これには 2 つのわずかな違いがあります。まず、プログレスバーの現在の値を、プログレスバーの "variable" 設定オプションによってリンクされた変数に格納するだけです。そのように、変数を変更すると、プログレスバーが更新されます。もう1つの方法は、プログレスバーの "step ?amount?" を呼び出すことです。メソッドを使用して、指定された "amount" (デフォルトは 1.0 )で値をインクリメントします。 |
不確定モードとは、あなたが実際に長時間実行しているタスクの中でどのくらいの距離を容易に知ることができないか(または見積もることができない)、操作がまだ実行中であることをユーザーにフィードバックしたい場合です 墜落した)。 途中で進捗状況を示すための特定の値を提供するのではなく、操作の開始時にプログレスバーの "start" メソッドを呼び出し、操作の最後に "stop" メソッドを呼び出します。 プログレスバーが残りの部分を処理します。 |
スケールウィジェットは、ユーザーが直接操作で数値を選択する方法を提供します。![]() perl Tkx : Scaleウィジェットは、new_ttk__scale メソッド a.k.a. Tkx::ttk__scale を使用して作成されます。 $parent->new_ttk__scale(-orient => 'horizontal', -length => 200, -from => 1.0, -to => 100.0)Python : Scaleウィジェットは、ttk.Scale 関数を使用して作成されます。 s = ttk.Scale(parent, orient=HORIZONTAL, length=200, from_=1.0, to=100.0)スケールウィジェットは、ユーザーが操作できるように設計されている点を除いて、いくつかの点でプログレスバーと似ています。プログレスバーの場合と同様に、 "orient" 構成オプションとオプションの "length" を使用して方向(水平または垂直)を指定する必要があります。スケールでユーザーが選択できる数の範囲も定義する必要があります。これを行うには、 "from" および "to" 構成オプションのそれぞれに浮動小数点数を設定します。 スケールの現在の値( "from" と "to" の間の浮動小数点値でなければなりません)を設定する方法はいくつかあります。スケールの "value" 設定オプションを設定(または読み込み、現在の値を取得)することができます。 "variable" オプションを使用して、スケールを変数にリンクすることができます。または、スケールの "set value" メソッドを呼び出して値を変更するか、 "get" メソッドを呼び出して現在の値を読み取ることができます。 "command" 設定オプションがあり、スケールが変更されるたびに呼び出すスクリプトを指定できます。 Tk は、このスクリプトを呼び出すたびに自動的にスケールの現在の値をパラメータとして追加します(スクロールバーのコールバックに追加されたパラメータとスクロールされたウィジェットのパラメータが追加されています)。 他のテーマウィジェットと同様に、ユーザーがスケールを変更しないようにするには、 "state disabled" 、 "state!disabled" および "instate disabled" メソッドを使用できます。 スケールウィジェットは実際の値を表示しないので、それらをラベルとして追加することができます。 |
More Widgets |
|