|
|
TkDocs_Tk Text. |
H.Kamifuji . |
テキストウィジェットは、複数行テキスト領域を管理します。 キャンバスウィジェットのように、Tk のテキストウィジェットは非常に柔軟で強力なツールであり、多種多様なタスクに使用できます。 テキストウィジェットの使用例には、フォームの一部としてシンプルな複数行テキストエリアを提供すること、スタイル付きコードエディタ、アウトライナー、Webブラウザなどが含まれています。 テキストウィジェットは古典的なTkウィジェットの一部であり、テーマのTkウィジェットではありません。![]() perl Tkx : テキストウィジェットは、new_tk__text メソッド a.k.a. Tkx::tk__text を使用して作成されます。 $text = $parent->new_tk__text(-width => 40, -height => 10);Python : テキストウィジェットは、テキスト関数を使用して作成されます。 text = Text(parent, width=40, height=10)前の章で簡単にテキストウィジェットを紹介しましたが、ここでは洗練さのレベルを感じ取るために、さらに詳しく説明します。 それでも、テキストウィジェットの重要な作業のために、リファレンスマニュアルは非常に整理され、有用である。 |
テキストウィジェットを使用してフォームの一部として単純な複数行のテキストを取得する場合、気にする必要があるのはウィジェットの作成とサイズ変更(チェック)、 フォーム内のテキストの初期値、およびユーザーがフォームを送信した後にウィジェット内のテキストを取得します。 |
最初に作成すると、テキストウィジェットには何も含まれていないので、最初のテキストを提供したい場合は、それを自分で追加します。 たとえば、エントリウィジェットとは異なり、テキストウィジェットは "textvariable" 設定オプションをサポートしていません。 私たちがすぐに見るように、テキストウィジェットには単なるテキスト以外のものも含まれている可能性があるので、単純な変数ではそれをすべて保持するには不十分です。 代わりに、ウィジェットの最初のテキストを設定するには、ウィジェットの「挿入」メソッドを使用します。 perl Tkx : $text->insert("1.0", "here is my text to insert");Python : text.insert('1.0', 'here is my text to insert')ここでの "1.0" は、テキストを挿入する場所を表し、"line 1, character 0" として読み取ることができます。 これは最初の行の最初の文字を参照します。 プログラマが通常行と文字をどのように参照しているかに関係する歴史的な規則については、行番号は 1 から始まり、文字番号は 0 から始まります。 挿入するテキストは単なる文字列です。 ウィジェットは複数行のテキストを保持できるので、指定した文字列は複数行にすることもできます。 これを行うには、文字列の適切な場所に "\n"(改行)文字を埋め込むだけです。 |
テキストウィジェットには、スクロールバー(水平と垂直の両方)を付けることができます。 これは、リストボックスやキャンバスなどの他のウィジェットでスクロールバーを使用するのとまったく同じです。 テキストの特定の部分が表示されるようにウィジェットに依頼することもできます。 たとえば、画面に収まらないテキストをウィジェットに追加した場合(つまりスクロールする場合)、下部ではなくテキストの上部が見えるようにするには、 "see" メソッドを呼び出して テキストの位置( "1.0" など)。 |
ウィジェットの一部のテキスト行が非常に長く、ウィジェットの幅よりも長い場合はどうなりますか? デフォルトでは、テキストは次の行に折り返されますが、もし行なわれているかどうかは、 "wrap" 設定オプションで制御できます。 デフォルト値は "char" で、行末の文字を右に折り返すことを意味します。 他のオプションは折り返しを発生させる「単語」であり、単語区切り(スペースなど)のみであり、「なし」という意味はまったく折り返さない。 後者の場合、ウィジェットに水平スクロールバーを付けない限り、テキストの一部が表示されません。 |
特定の条件が満たされていない場合(たとえば、他のオプションが特定の値に設定されている場合など)は、ウィジェットの編集を一時的に無効にするフォームもあります。 ユーザーがテキストウィジェットを変更しないようにするには、 "state" 設定オプションを "disabled" に設定します。 このオプションを "normal" に戻して編集を再度有効にします。 |
最後に、ユーザーが変更を加えてフォームを送信した後、プログラムはウィジェットの内容を取得することになります。これは "get" メソッドで行います perl Tkx : $thetext = $text->get("1.0", "end");Python : thetext = text.get('1.0', 'end') |
ユーザーはテキストウィジェット内のテキストをインタラクティブに変更することができますが、プログラムは変更を加えることもできます。 テキストを追加するには、 "insert" メソッドを使用します。このメソッドは、テキストウィジェットの初期値を提供するために使用しました。 |
"1.0" (最初の行、最初の文字)の位置を指定すると、これはインデックスの例でした。 これは、新しいテキストを挿入する場所を挿入メソッドに指示します(最初の行、最初の文字の直前、つまりウィジェットの最初の部分)。 これらのインデックスを指定するには、さまざまな方法があります。 また、別のものも見たことがあります。 "get" という例からの「end」は、テキストの挿入が指定されたインデックスの直前に来るため、テキストの最後をちょうど過ぎたことを意味します。 ウィジェットの最後にテキストを追加します)。 Tk はテキストウィジェットの最後に常に改行を追加することに注意してください。 インデックスの追加の例とその意味は次のとおりです。
心に留めておくべきいくつかの追加事項:
|
"insert" メソッドはウィジェットのどこにでも新しいテキストを追加しますが、 "delete" メソッドはそれを削除します。 削除する単一の文字(索引による)または開始索引および終了索引で指定された文字の範囲のいずれかを指定できます。 後者の場合、開始インデックスから終了インデックスの直前までの文字が削除されます(したがって、終了インデックスの文字は削除されません)。 これにより、テキストの最初から 1 行のテキスト(末尾の改行を含む)が削除されます。 perl Tkx : $text->delete("1.0", "2.0");Python : text.delete('1.0', '2.0')また、開始インデックスを取り、インデックスと文字列をパラメータとして終了する "replace" メソッドもあります。 削除と同じことを行い、その後同じ場所に挿入します。 |
テキストウィジェットをアプリケーション用の 80x24 ロギングウィンドウとして使用する方法を示す短い例です。 ユーザーはテキストウィジェットをまったく編集しません。 代わりに、プログラムはログメッセージを書き込みます。 コンテンツを24行以内に保持したいので(スクロールしないように)、最後に新しいメッセージを追加するときは、既に24行がある場合は、古いメッセージを上から削除する必要があります。 perl Tkx : use Tkx; $mw = Tkx::widget->new("."); $log = $mw->new_tk__text(-state => "disabled", -width => 80, -height => 24, -wrap => "none"); $log->g_grid; sub writeToLog { my ($msg) = @_; $numlines = $log->index("end - 1 line"); print $numlines . "\n"; $log->configure(-state => "normal"); if ($numlines==24) {$log->delete("1.0", "2.0");} if ($log->index("end-1c")!="1.0") {$log->insert_end("\n");} $log->insert_end($msg); $log->configure(-state => "disabled"); }Python : from tkinter import * from tkinter import ttk root = Tk() log = Text(root, state='disabled', width=80, height=24, wrap='none') log.grid() def writeToLog(msg): numlines = log.index('end - 1 line').split('.')[0] log['state'] = 'normal' if numlines==24: log.delete(1.0, 2.0) if log.index('end-1c')!='1.0': log.insert('end', '\n') log.insert('end', msg) log['state'] = 'disabled'ウィジェットは無効になっているため、プログラムからでも変更を加えるためにウィジェットを再度有効にしなければならなかったことに注意してください |
今までは、プレーンテキストだけを扱ってきました。 今度は、太字、イタリック、取り消し線、背景色、フォントサイズなど、特殊な書式を追加する方法を見てみましょう。 Tk のテキストウィジェットはtagsという機能を使ってこれらを実装しています。 タグは、テキストウィジェットに関連付けられたオブジェクトです。 各タグは、プログラマによって選択された名前を介して参照される。各タグには、さまざまな設定オプションがあります。 これらはテキストの書式設定に使用されるフォント、色などのようなものです。 タグは状態を持つオブジェクトですが、明示的に作成する必要はありません。 タグ名が初めて使用されたときに自動的に作成されます。 |
タグは、ウィジェット内のテキストの 1 つ以上の範囲に関連付けることができます。 前述のように、これらはインデックスによって指定されます。 1 文字を表す単一の索引、および開始文字から終了文字の直前までの範囲を表す開始および終了索引が含まれます。 タグは、 "tag add" メソッドを使用してテキストの範囲に追加することができます。 perl Tkx : $text->tag_add("highlightline", "5.0", "6.0");Python : text.tag_add('highlightline', '5.0', '6.0')挿入するテキストに追加する 1 つ以上のタグのリストを保持する "insert" メソッドにオプションのパラメータを追加することで、テキストを挿入するときにタグを提供することもできます。 perl Tkx : $text->insert_end("new material to insert", "highlightline recent warning");Python : text.insert('end', 'new material to insert', ('highlightline', 'recent', 'warning'))ウィジェットのテキストが変更されると、ユーザーまたはプログラムによって、タグは自動的に調整されます。 たとえば、 "the quick brown fox" のタグに "nounphrase" というタグを付け、"quick" という単語を "speedy" に置き換えた場合、タグはフレーズ全体に適用されます。 |
書式設定は設定オプションを使用してタグに適用されます。 これらはウィジェット全体の設定オプションと同様に動作します。 例として: perl Tkx : $text->tag_configure("highlightline", -background => "yellow", -font => "helvetica 14 bold", -relief => "raised");Python : text.tag_configure('highlightline', background='yellow', font='helvetica 14 bold', relief='raised')"背景 "、 "bgstipple" 、 "borderwidth" 、 "elide" 、 "fgstipple" 、 "font" 、 "foreground" 、 "justify" 、 "lmargin1" 、 "lmargin2" 、 "overstrike" 、 "rmargin" 、 "spacing1" 、 "spacing2" 、 "spacing3" 、 "tabs" 、 "tabstyle" 、 "underline" 、および "wrap" のうちの 1 つ以上を含む。 これらの詳細な説明については、リファレンスマニュアルを参照してください。 "tag cget" メソッドでは、タグの設定オプションを問い合わせることができます。 同じ範囲のテキストに複数のタグを適用できるため、競合する可能性があります(たとえば、2 つのタグが異なるフォントを指定しているなど)。 優先順位はこれらを解決するために使用されます。 最も最近作成されたタグが最も高い優先順位を有するが、優先順位は "tag raise" および "tag lower" 方法を使用して再編成することができる。 |
タグを完全に削除するには、 "tag delete" メソッドを使用します。これは、もちろん、テキスト内のタグへの参照も削除します。また、 "tag remove" メソッドを使用して、ある範囲のテキストからタグを削除することもできます。そのタグでテキストの範囲を残さなくても、タグオブジェクト自体はまだ存在します。 "tag ranges" メソッドは、タグが適用されたテキスト内の範囲のリストを返します。また、 "tag nextrange" と "tag prevrange" メソッドがあり、指定された位置から最初の範囲を前方または後方に検索します。 追加のパラメータなしで呼び出される "tag names" メソッドは、テキストウィジェットに現在定義されているすべてのタグ(現在使用されていないタグを含む)のリストを返します。メソッドにインデックスを渡すと、インデックスの文字だけに適用されたタグのリストが返されます。 最後に、 "end" または "2.5" と同じ方法で、指定されたタグを持つテキストの最初と最後の文字をインデックスとして使用できます。これを行うには、単に "tagname.first" または "tagname.last" を指定します。 |
キャンバス・ウィジェットとテキスト・ウィジェットの両方は、複数のオブジェクトに適用してスタイルを設定するなどのために使用できる "tags" をサポートしていますが、これらのタグは同じものではありません。 注意すべき重要な違いがあります。 キャンバスウィジェットでは、個々のキャンバスアイテムにはその外観を制御する設定オプションがあります。 キャンバス内のタグを参照するとき、その意味は「現在そのタグを持つすべてのキャンバスアイテム」と同じです。 タグ自体は別のオブジェクトとして存在しません。 したがって、次のスニペットでは、追加された最後の矩形は赤色になりません。 perl Tkx : $canvas->itemconfigure("important", -fill => "red"); $canvas->create_rectangle(10, 10, 40, 40, -tags => "important");Python : canvas.itemconfigure('important', fill='red') canvas.create_rectangle(10, 10, 40, 40, tags=('important'))対照的に、テキストウィジェットでは、外観に関する状態情報を保持するのは個々の文字ではなく、独自のオブジェクトであるタグです。 したがって、このスニペットでは、新しく追加されたテキストは赤色になります。 perl Tkx : $text->insert_end("first text", "important"); $text->tag_configure("important", -foreground => "red"); $text->insert_end("second text", "important");Python : text.insert('end', 'first text', ('important')) text.tag_configure('important', foreground='red') text.insert('end', 'second text', ('important')) |
1 つの非常にクールなことは、タグにイベントバインディングを定義できることです。 これにより、特定の範囲のテキストだけで簡単にマウスのクリックを認識したり、メニューやダイアログをポップアップしたりすることができます。 異なるタグは異なるバインディングを持つことができるため、「この場所のクリックはどういう意味ですか?」といった質問を並べ替える手間が省けます。 タグ上のバインディングは、 "tag bind" メソッドを使用して実装されます。 perl Tkx : $text->tag_bind("important", "<1>", sub{popupImportantMenu});Python : text.tag_bind('important', '<1>', popupImportantMenu)イベントへのウィジェット全体のバインディングは、他のすべてのウィジェットと同様に機能します。 通常の低レベルのイベントの他に、生成される 2 つの仮想イベントがあります:ウィジェットの内容が変更されるたびに <Modified> 、テキストが選択されたときに <Selection> が変更されるたびに<Selection> |
あなたのプログラムは、ある範囲のテキストがユーザによって選択されているかどうかを知りたい場合があり、そうであればその範囲は何かを知りたい場合があります。たとえば、選択したテキストをエディタで太字にするツールバーボタンがあります。 <Selection> 仮想イベントを使用して、選択が変更されたとき(たとえば、太字ボタンがアクティブであるかどうかを更新する)を知ることができますが、選択した内容はわかりません。 テキストウィジェットは、選択されたテキストを参照する "sel" という名前のタグを自動的に保持します。選択が変更されるたびに、 "sel" タグが更新されます。したがって、 "tag ranges" メソッドを使用して選択されたテキストの範囲を見つけることができます。 "sel" をレポートするタグとして渡します。 同様に、選択を変更するには、 "tag add" を使用して新しい選択を設定するか、 "tag remove" を選択して選択を削除します。もちろん、 "sel" タグは実際には削除できません。 デフォルトのウィジェットバインディングではこれが起こらないようにしていますが、 "sel" は複数の範囲をサポートできるという点で他のタグと似ています。コードから選択を変更するときにこれを防ぐには、新しい選択項目を追加する前に古い選択項目を削除してください。 テキストウィジェットは、選択とは別の挿入カーソル(新しく入力されたテキストが表示される)の概念を管理します。これは、マークと呼ばれる新しいコンセプトを使用しています。 |
マークは、テキスト内の特定の場所を示すために使用されます。その点では、テキストが変更されるとマークが同じ相対位置になるよう調整される点を除き、インデックスのようになります。その方法では、タグに似ていますが、テキストの範囲ではなく単一の位置を参照します。マークは、実際には文字の占める位置を指すのではなく、2文字の間の位置を指定します。 Tk は自動的に2つの異なるマークを維持します。最初のものは "insert" と呼ばれ、挿入カーソルの現在の位置です。カーソルが(マウスまたはキーボードを介して)動かされると、それと共にマークも移動する。 2 番目のマークは "current" という名前で、現在のマウス位置の下の文字の位置を反映します。 独自のマークを作成するには、ウィジェットの "mark set" メソッドを使用して、マークの名前とインデックス(マークは指定されたインデックスの文字の直前に配置されます)を渡します。これは、既存のマークを別の位置に移動するためにも使用されます。マークは、 "mark unset" メソッドを使用して削除し、マークの名前を渡すことができます。マークを含むテキストの範囲を削除すると、マークも削除されます。 マークの名前をインデックスとして使用することもできます( "1.0" または "end-1c" のインデックスと同じ方法で)。 "mark next" または "mark previous" の方法を使用して、テキスト内の特定のインデックスから次のマーク(または前のマーク)を見つけることができま>す。 "mark names" メソッドは、すべてのマークの名前のリストを返します。 マークにも重力があります。この重力は "mark gravity" 法で修正することができます。これは、マークがテキストに挿入されたときに何が起こるかに影響します。その間に "a|c" という記号を付けて "ac" というテキストが表示されているとします。マークの重力が「右」(デフォルト)の場合、マークは "c" にアタッチされます。新しいテキスト "b" がマークに挿入されている場合、マークは "c" に固定されたままであるので、マークの前に新しいテキスト、すなわち "ab|c" が挿入される。重力が代わりに "left" の場合、マークは "a" にアタッチされるので、マークの後に新しいテキスト、つまり "a|bc" が挿入されます。 |
キャンバスウィジェットのように、テキストウィジェットにはテキストだけでなく、イメージや他の Tk ウィジェット(他の多くのウィジェットを含むフレーム自体も含む)を含めることができます。 いくつかの意味では、これにより、テキストウィジェットは、独自のジオメトリマネージャとして機能することができます。 テキスト内に画像やウィジェットを追加する機能により、プログラムの可能性が広がります。 イメージは特定のインデックスのテキストウィジェットに追加され、イメージは通常既存のTkイメージとして指定されます。 パディングなどの微調整を可能にする他のオプションもあります。 perl Tkx : Tkx::image_create_photo( "flowers", -file => "flowers.gif"); $text->image_create("sel.first", -image => "flowers");Python : flowers = PhotoImage(file='flowers.gif') text.image_create('sel.first', image=flowers)ウィジェットはイメージとほぼ同じ方法でテキストウィジェットに追加されます。 追加するウィジェットは、ウィンドウ階層全体のテキストウィジェットの子孫である必要があります。 perl Tkx : $b = $text->new_ttk__button(-text => "Push Me"); $text->window_create("1.0", -window => $b);Python : b = ttk.Button(text, text='Push Me') text.window_create('1.0', window=b) |
テキストウィジェットができることはほかにもたくさんあります。 ここでは、それらのうちのいくつかについて簡単に触れます。 これらの使用方法の詳細については、リファレンスマニュアルを参照してください。 |
テキストウィジェットには強力な "search" メソッドが含まれており、ウィジェット内のテキストを見つけることができます。 明らかな例の 1 つとして、これは "Find" ダイアログに便利です。 特定の位置または特定の範囲内を前後に検索したり、正確なテキストを使用して検索を指定したり、大文字と小文字を区別したり、正規表現を使用したり、検索用語の1つまたはすべてを検索したりできます。 |
テキストウィジェットは、テキストを変更したかどうかを追跡します(たとえば、保存する必要があるかどうかを知るのに便利です)。これは、 "edit modified" メソッドを使用して照会(または変更)できます。 "undo" 設定オプションを true に設定すると、ウィジェットによって自動的に管理される、完全な複数レベルの取り消し/やり直しの仕組みもあります。 "edit undo" または "edit redo" を呼び出すと、取り消し/やり直しスタックに保存されている情報を使用して現在のテキストが変更されます。 |
ウィジェットに表示されないテキストを実際に含めることができます。 これは "elided" テキストと呼ばれ、タグの "elide" 設定オプションを使用して利用できます。 これを使用してアウトライナーや "folding" コードエディターを実装したり、テキストと混在した余分なメタデータを埋め込んだりすることもできます。 省略されたテキストで位置を指定するときは、少し注意する必要があります。したがって、位置を扱うコマンドには、省略されたテキストを含めるか無視するかのオプションがあります。 |
ほとんどの Tk ウィジェットと同様に、テキストウィジェットは内部状態に関する情報を公開するために外に出ます。 "get" メソッド、ウィジェット設定オプション、タグとマークの両方のための "names" と "cget" などの点で、これのほとんどを見てきました。 さまざまなタスクに使用できるさらに多くの情報があります。 リファレンスマニュアルの "debug"、 "dlineinfo"、 "bbox"、 "count"、 "dump" メソッドを調べてください。 |
Tk テキストウィジェットは、2 つ以上の異なるテキストウィジェット間で(テキスト、マーク、タグ、イメージなどを含む)同じ基礎テキストデータを共有することができます。 これはピアリングと呼ばれ、 "peer" 方式で制御されます。 |
use Tkx; $mw = Tkx::widget->new("."); $log = $mw->new_tk__text(-state => "disabled", -width => 80, -height => 24, -wrap => "none"); $log->g_grid; writeToLog( "Hiroshi\nKamifuji\nHitachinaka\n" ); writeToLog( "Hiroshi\nKamifuji\nHitachinaka\n" ); sub writeToLog { my ($msg) = @_; $numlines = $log->index("end - 1 line"); print $numlines . "\n"; $log->configure(-state => "normal"); if ($numlines==24) {$log->delete("1.0", "2.0");} if ($log->index("end-1c")!="1.0") {$log->insert_end("\n");} $log->insert_end($msg); $log->configure(-state => "disabled"); } Tkx::MainLoop(); ![]() |
use Tkx; $mw = Tkx::widget->new("."); $log = $mw->new_tk__text(-state => "disabled", -width => 80, -height => 24, -wrap => "none"); $log->g_grid; writeToLog( "Hiroshi\nKamifuji\nHitachinaka\n" ); writeToLog( "Hiroshi\nKamifuji\nHitachinaka\n" ); sub writeToLog { my ($msg) = @_; $numlines = $log->index("end - 1 line"); print $numlines . "\n"; $log->configure(-state => "normal"); if ($numlines==24) {$log->delete("1.0", "2.0");} if ($log->index("end-1c")!="1.0") {$log->insert_end("\n");} $log->tag_configure("highlightline", -background => "yellow", -font => "helvetica 14 bold", -relief => "raised"); $log->insert_end("--> new material to insert\n", "highlightline recent warning"); $log->insert_end($msg); $log->configure(-state => "disabled"); } Tkx::MainLoop(); ![]() |
use Tkx; $mw = Tkx::widget->new("."); $log = $mw->new_tk__text(-state => "disabled", -width => 80, -height => 24, -wrap => "none"); $log->g_grid; writeToLog( "Hiroshi\nKamifuji\nHitachinaka\n" ); writeToLog( "Hiroshi\nKamifuji\nHitachinaka\n" ); sub writeToLog { my ($msg) = @_; $numlines = $log->index("end - 1 line"); print $numlines . "\n"; $log->configure(-state => "normal"); if ($numlines==24) {$log->delete("1.0", "2.0");} if ($log->index("end-1c")!="1.0") {$log->insert_end("\n");} # $log->tag_configure("highlightline", -background => "yellow", -font => "helvetica 14 bold", -relief => "raised"); # $log->insert_end("--> new material to insert\n", "highlightline recent warning"); $log->insert_end("first text\n", "important"); $log->tag_configure("important", -foreground => "red"); $log->insert_end("second text\n", "important"); $log->insert_end($msg); $log->configure(-state => "disabled"); } Tkx::MainLoop(); ![]() |
use Tkx; $mw = Tkx::widget->new("."); my $menu = $mw->new_menu(); foreach ("One", "Two", "Three") {$menu->add_command(-label => $_);} if (Tkx::tk_windowingsystem() eq "aqua") { $mw->g_bind("<2>", [sub {my($x,$y) = @_; $menu->g_tk___popup($x,$y)}, Tkx::Ev("%X", "%Y")] ); $mw->g_bind("<Control-1>", [sub {my($x,$y) = @_; $menu->g_tk___popup($x,$y)}, Tkx::Ev("%X", "%Y")]); } else { $mw->g_bind("<3>", [sub {my($x,$y) = @_; $menu->g_tk___popup($x,$y)}, Tkx::Ev("%X", "%Y")]); } $log = $mw->new_tk__text(-state => "disabled", -width => 80, -height => 24, -wrap => "none"); $log->g_grid; $b = $log->new_ttk__button(-text => "Push Me"); $be = $log->new_ttk__button(-text => "Push Me end"); $log->window_create("1.0", -window => $b); writeToLog( "Hiroshi\nKamifuji\nHitachinaka\n" ); writeToLog( "Hiroshi\nKamifuji\nHitachinaka\n" ); $log->window_create("end", -window => $be); sub writeToLog { my ($msg) = @_; $numlines = $log->index("end - 1 line"); print $numlines . "\n"; $log->configure(-state => "normal"); if ($numlines==24) {$log->delete("1.0", "2.0");} if ($log->index("end-1c")!="1.0") {$log->insert_end("\n");} $log->tag_configure("highlightline", -background => "yellow", -font => "helvetica 14 bold", -relief => "raised"); $log->insert_end("--> new material to insert\n", "highlightline recent warning"); # $log->insert_end("first text\n", "important"); # $log->tag_configure("important", -foreground => "red"); # $log->insert_end("second text\n", "important"); $log->insert_end($msg); $log->configure(-state => "disabled"); } Tkx::MainLoop(); ![]() |
Text |
|