tkinter — Tcl / TkへのPythonインターフェース—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/3.10/library/tkinter
移動先:案内検索

tkinter — Tcl / TkへのPythonインターフェース

ソースコード: :source: `Lib / tkinter / __ init __。py`



tkinter パッケージ(「Tkインターフェース」)は、Tcl / TkGUIツールキットへの標準のPythonインターフェースです。 Tkと tkinter はどちらも、macOSを含むほとんどのUnixプラットフォーム、およびWindowsシステムで使用できます。

コマンドラインからpython -m tkinterを実行すると、シンプルなTkインターフェイスを示すウィンドウが開き、 tkinter がシステムに正しくインストールされていることと、インストールされているTcl / Tkのバージョンが示されます。 、そのバージョンに固有のTcl / Tkドキュメントを読むことができます。

Tkinterは、スレッドサポートの有無にかかわらず構築されたTcl / Tkバージョンの範囲をサポートします。 公式のPythonバイナリリリースには、スレッド化されたTcl / Tk8.6がバンドルされています。 サポートされているバージョンの詳細については、_tkinterモジュールのソースコードを参照してください。

Tkinterは薄いラッパーではありませんが、エクスペリエンスをよりパイソンにするために独自のロジックをかなり追加しています。 このドキュメントでは、これらの追加と変更に重点を置いており、変更されていない詳細については、公式のTcl / Tkドキュメントを参照してください。

ノート

Tcl / Tk 8.5(2007)は、テーマのあるユーザーインターフェイスコンポーネントの最新セットと、それらを使用するための新しいAPIを導入しました。 古いAPIと新しいAPIの両方が引き続き利用可能です。 オンラインで見つかるほとんどのドキュメントはまだ古いAPIを使用しており、ひどく古くなっている可能性があります。


も参照してください

  • *; TkDocs
    Tkinterを使用したユーザーインターフェイスの作成に関する広範なチュートリアル。 重要な概念を説明し、最新のAPIを使用した推奨アプローチを示します。
  • *; Tkinter 8.5リファレンス:Python用のGUI
    利用可能なクラス、メソッド、およびオプションの詳細を示すTkinter8.5のリファレンスドキュメント。

Tcl / Tkリソース:

  • *; Tkコマンド
    Tkinterによって使用される基礎となるTcl / Tkコマンドのそれぞれへの包括的なリファレンス。
  • *; Tcl / Tkホームページ
    追加のドキュメント、およびTcl / Tkコア開発へのリンク。

書籍:


建築

Tcl / Tkは単一のライブラリではなく、いくつかの異なるモジュールで構成されており、それぞれに個別の機能と独自の公式ドキュメントがあります。 Pythonのバイナリリリースには、アドオンモジュールも同梱されています。

Tcl
Tclは、Pythonと同じように、動的に解釈されるプログラミング言語です。 汎用プログラミング言語として単独で使用できますが、最も一般的には、スクリプトエンジンまたはTkツールキットへのインターフェイスとしてCアプリケーションに組み込まれます。 Tclライブラリには、Tclインタプリタの1つ以上のインスタンスを作成および管理し、それらのインスタンスでTclコマンドとスクリプトを実行し、TclまたはCのいずれかに実装されたカスタムコマンドを追加するためのCインターフェイスがあります。 各インタープリターにはイベントキューがあり、イベントを送信して処理する機能があります。 Pythonとは異なり、Tclの実行モデルは協調マルチタスクを中心に設計されており、Tkinterはこの違いを埋めます(詳細については、スレッドモデルを参照してください)。
Tk
Tkは、Cで実装された Tclパッケージであり、GUIウィジェットを作成および操作するためのカスタムコマンドを追加します。 各 Tk オブジェクトは、Tkがロードされた独自のTclインタープリターインスタンスを埋め込みます。 Tkのウィジェットは非常にカスタマイズ可能ですが、外観は古くなっています。 Tkは、Tclのイベントキューを使用してGUIイベントを生成および処理します。
Ttk
Themed Tk(Ttk)は、Tkウィジェットの新しいファミリーであり、従来のTkウィジェットの多くよりもさまざまなプラットフォームではるかに優れた外観を提供します。 Ttkは、Tkバージョン8.5以降、Tkの一部として配布されます。 Pythonバインディングは、別のモジュール tkinter.ttk で提供されます。

内部的には、TkとTtkは、基盤となるオペレーティングシステムの機能、つまり、Unix / X11のXlib、macOSのCocoa、WindowsのGDIを使用します。

PythonアプリケーションがTkinterのクラスを使用する場合、たとえばウィジェットを作成する場合、 tkinter モジュールは最初にTcl / Tkコマンド文字列をアセンブルします。 そのTclコマンド文字列を内部_tkinterバイナリモジュールがTclインタープリターを呼び出して評価します。 次に、TclインタープリターはTkおよび/またはTtkパッケージを呼び出し、次にXlib、Cocoa、またはGDIを呼び出します。


Tkinterモジュール

Tkinterのサポートは、いくつかのモジュールに分散しています。 ほとんどのアプリケーションには、メインの tkinter モジュールと、最新のテーマウィジェットセットとAPIを提供する tkinter.ttk モジュールが必要です。

from tkinter import *
from tkinter import ttk
class tkinter.Tk(screenName=None, baseName=None, className='Tk', useTk=1)
Tk クラスは、引数なしでインスタンス化されます。 これにより、通常はアプリケーションのメインウィンドウであるTkのトップレベルウィジェットが作成されます。 各インスタンスには、独自のTclインタープリターが関連付けられています。
tkinter.Tcl(screenName=None, baseName=None, className='Tk', useTk=0)
Tcl()関数は、Tkサブシステムを初期化しないことを除いて、 Tk クラスによって作成されたものとよく似たオブジェクトを作成するファクトリ関数です。 これは、無関係なトップレベルウィンドウを作成したくない環境、または作成できない環境(XサーバーのないUnix / Linuxシステムなど)でTclインタープリターを駆動する場合に最もよく役立ちます。 Tcl()オブジェクトによって作成されたオブジェクトは、そのloadtk()メソッドを呼び出すことにより、トップレベルウィンドウを作成(およびTkサブシステムを初期化)することができます。

Tkサポートを提供するモジュールは次のとおりです。

tkinter
メインTkinterモジュール。
tkinter.colorchooser
ユーザーが色を選択できるようにするダイアログ。
tkinter.commondialog
ここにリストされている他のモジュールで定義されているダイアログの基本クラス。
tkinter.filedialog
ユーザーが開くまたは保存するファイルを指定できるようにする一般的なダイアログ。
tkinter.font
フォントの操作に役立つユーティリティ。
tkinter.messagebox
標準のTkダイアログボックスへのアクセス。
tkinter.scrolledtext
垂直スクロールバーが組み込まれたテキストウィジェット。
tkinter.simpledialog
基本的なダイアログと便利な機能。
tkinter.ttk
Tk 8.5で導入されたテーマウィジェットセットは、メインの tkinter モジュールの多くのクラシックウィジェットに最新の代替手段を提供します。

追加モジュール:

_tkinter
Tcl / Tkへの低レベルインターフェイスを含むバイナリモジュール。 メインの tkinter モジュールによって自動的にインポートされるため、アプリケーションプログラマーが直接使用しないでください。 通常は共有ライブラリ(またはDLL)ですが、Pythonインタープリターと静的にリンクされている場合もあります。
idlelib
Pythonの統合開発および学習環境(IDLE)。 tkinter に基づいています。
tkinter.constants
さまざまなパラメーターをTkinter呼び出しに渡すときに、文字列の代わりに使用できるシンボリック定数。 メインの tkinter モジュールによって自動的にインポートされます。
tkinter.dnd
(実験的) tkinter のドラッグアンドドロップのサポート。 これは、TkDNDに置き換えられると非推奨になります。
tkinter.tix
(非推奨)いくつかの新しいウィジェットを追加する古いサードパーティのTcl / Tkパッケージ。 ほとんどの場合、より良い代替手段が tkinter.ttk にあります。
turtle
Tkウィンドウのタートルグラフィックス。


Tkinter Life Preserver

このセクションは、TkまたはTkinterのいずれかに関する完全なチュートリアルとなるようには設計されていません。 そのためには、前述の外部リソースの1つを参照してください。 代わりに、このセクションでは、Tkinterアプリケーションがどのように見えるかについて非常に簡単に説明し、基本的なTkの概念を特定し、Tkinterラッパーがどのように構成されているかを説明します。

このセクションの残りの部分では、Tkinterアプリケーションで必要となるクラス、メソッド、オプションを特定し、公式のTcl / Tkリファレンスマニュアルなど、それらに関する詳細なドキュメントを見つけるのに役立ちます。

HelloWorldプログラム

まず、Tkinterの「HelloWorld」アプリケーションについて説明します。 これは私たちが書くことができる最小のものではありませんが、あなたが知る必要があるいくつかの重要な概念を説明するのに十分です。

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()

インポート後、次の行は Tk クラスのインスタンスを作成します。これにより、Tkが初期化され、関連するTclインタープリターが作成されます。 また、アプリケーションのメインウィンドウとして機能するルートウィンドウと呼ばれるトップレベルウィンドウも作成します。

次の行はフレームウィジェットを作成します。この場合、このウィジェットには、次に作成するラベルとボタンが含まれます。 フレームはルートウィンドウ内に収まります。

次の行は、静的テキスト文字列を保持するラベルウィジェットを作成します。 grid()メソッドは、HTMLのテーブルの動作と同様に、含まれているフレームウィジェット内のラベルの相対的なレイアウト(位置)を指定するために使用されます。

次に、ボタンウィジェットが作成され、ラベルの右側に配置されます。 押すと、ルートウィンドウのdestroy()メソッドが呼び出されます。

最後に、mainloop()メソッドはすべてをディスプレイに表示し、プログラムが終了するまでユーザー入力に応答します。


重要なTkの概念

この単純なプログラムでさえ、次の主要なTkの概念を示しています。

ウィジェット
Tkinterユーザーインターフェイスは、個々のウィジェットで構成されています。 各ウィジェットは、ttk.Framettk.Labelttk.Buttonなどのクラスからインスタンス化されたPythonオブジェクトとして表されます。
ウィジェット階層
ウィジェットは階層に配置されています。 ラベルとボタンはフレーム内に含まれ、フレームはルートウィンドウ内に含まれていました。 各ウィジェットを作成すると、そのウィジェットが最初の引数としてウィジェットコンストラクターに渡されます。
構成オプション
ウィジェットには構成オプションがあり、ラベルやボタンに表示するテキストなど、ウィジェットの外観と動作を変更します。 ウィジェットのクラスが異なれば、オプションのセットも異なります。
ジオメトリ管理
ウィジェットは、作成時にユーザーインターフェイスに自動的に追加されません。 ジオメトリマネージャーは、gridのように、ユーザーインターフェイスのどこに配置するかを制御します。
イベントループ
Tkinterは、ユーザー入力に反応し、プログラムからの変更を行い、イベントループをアクティブに実行している場合にのみ表示を更新します。 プログラムがイベントループを実行していない場合、ユーザーインターフェイスは更新されません。


TkinterがTcl / Tkをラップする方法を理解する

アプリケーションがTkinterのクラスとメソッドを使用する場合、内部でTkinterはTcl / Tkコマンドを表す文字列を組み立て、アプリケーションの Tk インスタンスに接続されたTclインタープリターでそれらのコマンドを実行します。

リファレンスドキュメントをナビゲートしようとしている場合でも、適切なメソッドやオプションを見つけようとしている場合でも、既存のコードを適応させようとしている場合でも、Tkinterアプリケーションをデバッグしている場合でも、基盤となるTcl / Tkコマンドがどのように見えるかを理解すると役立つ場合があります。

説明のために、上記のTkinterスクリプトの主要部分に相当するTcl / Tkを次に示します。

ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0

Tclの構文は多くのシェル言語に似ており、最初の単語は実行されるコマンドであり、その後にそのコマンドへの引数がスペースで区切られています。 あまり多くの詳細に立ち入ることなく、次のことに注意してください。

  • ウィジェットの作成に使用されるコマンド(ttk::frameなど)は、Tkinterのウィジェットクラスに対応しています。
  • Tclウィジェットオプション(-textなど)は、Tkinterのキーワード引数に対応しています。
  • ウィジェットはTclのパス名.frm.btnなど)によって参照されますが、Tkinterは名前ではなくオブジェクト参照を使用します。
  • ウィジェット階層内のウィジェットの場所は、.(ドット)をパス区切り文字として使用する(階層)パス名でエンコードされます。 ルートウィンドウのパス名は.(ドット)です。 Tkinterでは、階層はパス名ではなく、各子ウィジェットを作成するときに親ウィジェットを指定することによって定義されます。
  • Tclで個別のコマンドとして実装される操作(griddestroyなど)は、Tkinterウィジェットオブジェクトではメソッドとして表されます。 すぐにわかるように、Tclはウィジェットオブジェクトのメソッド呼び出しのように見えるものを使用することもあります。これは、Tkinterで使用されるものをより厳密に反映しています。


どうすれば…? どのようなオプションがありますか…?

Tkinterで何かを行う方法がわからず、使用しているチュートリアルやリファレンスドキュメントですぐに見つからない場合は、役立つ戦略がいくつかあります。

まず、個々のウィジェットがどのように機能するかの詳細は、TkinterとTcl / Tkの両方のバージョンによって異なる可能性があることに注意してください。 ドキュメントを検索する場合は、システムにインストールされているPythonおよびTcl / Tkのバージョンに対応していることを確認してください。

APIの使用方法を検索するときは、使用しているクラス、オプション、またはメソッドの正確な名前を知ることが役立ちます。 インタラクティブなPythonシェルまたは print()を使用したイントロスペクションは、必要なものを特定するのに役立ちます。

ウィジェットで使用できる構成オプションを見つけるには、そのconfigure()メソッドを呼び出します。このメソッドは、デフォルト値や現在の値など、各オブジェクトに関するさまざまな情報を含むディクショナリを返します。 keys()を使用して、各オプションの名前だけを取得します。

btn = ttk.Button(frm, ...)
print(btn.configure().keys())

ほとんどのウィジェットには多くの共通の構成オプションがあるため、特定のウィジェットクラスに固有のオプションを見つけると便利です。 オプションのリストをフレームなどのより単純なウィジェットのリストと比較することは、そのための1つの方法です。

print(set(btn.configure().keys()) - set(frm.configure().keys()))

同様に、標準の dir()関数を使用して、ウィジェットオブジェクトで使用可能なメソッドを見つけることができます。 試してみると、200を超える一般的なウィジェットメソッドがあることがわかります。そのため、ウィジェットクラスに固有のメソッドを再度特定すると便利です。

print(dir(btn))
print(set(dir(btn)) - set(dir(frm)))

スレッドモデル

PythonとTcl / Tkのスレッドモデルは大きく異なり、 tkinter がブリッジしようとします。 スレッドを使用する場合は、これに注意する必要があるかもしれません。

Pythonインタープリターには、多くのスレッドが関連付けられている場合があります。 Tclでは、複数のスレッドを作成できますが、各スレッドには個別のTclインタープリターインスタンスが関連付けられています。 スレッドは複数のインタープリターインスタンスを作成することもできますが、各インタープリターインスタンスはそれを作成した1つのスレッドのみが使用できます。

tkinter によって作成された各 Tk オブジェクトには、Tclインタープリターが含まれています。 また、どのスレッドがそのインタプリタを作成したかを追跡します。 tkinter の呼び出しは、任意のPythonスレッドから行うことができます。 内部的には、 Tk オブジェクトを作成したスレッド以外のスレッドから呼び出しが行われた場合、イベントはインタープリターのイベントキューに投稿され、実行されると、結果は呼び出し元のPythonスレッドに返されます。

Tcl / Tkアプリケーションは通常、イベント駆動型です。つまり、初期化後、インタープリターはイベントループを実行します(つまり、 Tk.mainloop())そしてイベントに応答します。 シングルスレッドであるため、イベントハンドラーは迅速に応答する必要があります。そうしないと、他のイベントの処理がブロックされます。 これを回避するには、実行時間の長い計算をイベントハンドラーで実行しないでください。タイマーを使用して細かく分割するか、別のスレッドで実行してください。 これは、GUIがイベントハンドラーを含むすべてのアプリケーションコードとは完全に別のスレッドで実行される多くのGUIツールキットとは異なります。

Tclインタープリターがイベントループを実行しておらず、イベントを処理していない場合、Tclインタープリターを実行しているスレッド以外のスレッドから行われた tkinter 呼び出しは失敗します。

いくつかの特殊なケースが存在します。

  • Tcl / Tkライブラリは、スレッドを認識しないように構築できます。 この場合、 tkinter は、Tclインタープリターを作成したスレッドとは異なる場合でも、元のPythonスレッドからライブラリを呼び出します。 グローバルロックは、一度に1つの呼び出しのみが発生することを保証します。
  • tkinter を使用すると、 Tk オブジェクトの複数のインスタンスを(独自のインタープリターを使用して)作成できますが、同じスレッドの一部であるすべてのインタープリターは、共通のイベントキューを共有します。醜い速い。 実際には、一度に Tk のインスタンスを複数作成しないでください。 それ以外の場合は、それらを別々のスレッドで作成し、スレッド対応のTcl / Tkビルドを実行していることを確認することをお勧めします。
  • Tclインタープリターがイベントループに再び入るのを防ぐ方法は、イベントハンドラーをブロックすることだけではありません。 複数のネストされたイベントループを実行したり、イベントループを完全に放棄したりすることも可能です。 イベントやスレッドに関してトリッキーなことをしている場合は、これらの可能性に注意してください。
  • 現在、Tclインタープリターを作成したスレッドから呼び出された場合にのみ機能するいくつかの選択された tkinter 関数があります。


便利なリファレンス

オプションの設定

オプションは、ウィジェットの色や境界線の幅などを制御します。 オプションは、次の3つの方法で設定できます。

オブジェクト作成時、キーワード引数を使用
fred = Button(self, fg="red", bg="blue")
オブジェクトの作成後、オプション名を辞書インデックスのように扱います
fred["fg"] = "red"
fred["bg"] = "blue"
config()メソッドを使用して、オブジェクトの作成後に複数の属性を更新します
fred.config(fg="red", bg="blue")

特定のオプションとその動作の完全な説明については、問題のウィジェットのTkマニュアルページを参照してください。

マニュアルページには、各ウィジェットの「標準オプション」と「ウィジェット固有のオプション」がリストされていることに注意してください。 前者は多くのウィジェットに共通するオプションのリストであり、後者はその特定のウィジェットに固有のオプションです。 標準オプションは、 options(3)のマニュアルページに記載されています。

このドキュメントでは、標準オプションとウィジェット固有のオプションを区別していません。 一部のオプションは、一部の種類のウィジェットには適用されません。 特定のウィジェットが特定のオプションに応答するかどうかは、ウィジェットのクラスによって異なります。 ボタンにはcommandオプションがありますが、ラベルにはありません。

特定のウィジェットでサポートされているオプションは、そのウィジェットのマニュアルページにリストされています。または、引数なしでconfig()メソッドを呼び出すか、そのウィジェットでkeys()メソッドを呼び出すことにより、実行時にクエリを実行できます。 これらの呼び出しの戻り値は、キーが文字列としてのオプションの名前(たとえば、'relief')であり、値が5タプルである辞書です。

bgなどの一部のオプションは、長い名前を持つ一般的なオプションの同義語です(bgは「背景」の省略形です)。 config()メソッドを渡すと、省略形オプションの名前は5タプルではなく2タプルを返します。 返される2タプルには、同義語の名前と「リアル」オプション(('bg', 'background')など)が含まれます。

索引 意味
0 オプション名 'relief'
1 データベースルックアップのオプション名 'relief'
2 データベースルックアップのオプションクラス 'Relief'
3 デフォルト値 'raised'
4 現在の価値 'groove'

例:

>>> print(fred.config())
{'relief': ('relief', 'relief', 'Relief', 'raised', 'groove')}

もちろん、印刷される辞書には、使用可能なすべてのオプションとその値が含まれています。 これは単なる例です。


パッカー

パッカーは、Tkのジオメトリ管理メカニズムの1つです。 ジオメトリマネージャーは、コンテナー内のウィジェットの相対的な位置を指定するために使用されます-相互のマスター。 より面倒な配置ツール(あまり一般的に使用されないため、ここでは説明しません)とは対照的に、パッカーは定性的な関係仕様を取ります-の左側充填など-そしてあなたのために正確な配置座標を決定するためにすべてを解決します。

master ウィジェットのサイズは、内部の「スレーブウィジェット」のサイズによって決まります。 パッカーは、スレーブウィジェットがパックされるマスター内のどこに表示されるかを制御するために使用されます。 ウィジェットをフレームにパックしたり、フレームを他のフレームにパックしたりして、希望する種類のレイアウトを実現できます。 さらに、構成がパックされると、構成の増分変更に対応するように配置が動的に調整されます。

ウィジェットは、ジオメトリマネージャでジオメトリを指定するまで表示されないことに注意してください。 ジオメトリの仕様を省略して、ウィジェットが作成されても何も表示されないことに驚かされるのは、初期のよくある間違いです。 ウィジェットは、たとえば、パッカーのpack()メソッドが適用された後にのみ表示されます。

pack()メソッドは、ウィジェットがコンテナー内のどこに表示されるか、およびメインアプリケーションウィンドウのサイズが変更されたときのウィジェットの動作を制御するキーワードとオプション/値のペアを使用して呼び出すことができます。 ここではいくつかの例を示します。

fred.pack()                     # defaults to side = "top"
fred.pack(side="left")
fred.pack(expand=1)

パッカーオプション

パッカーとそれがとることができるオプションのより詳細な情報については、JohnOusterhoutの本のmanページと183ページを参照してください。

アンカー
アンカータイプ。 パッカーが各スレーブをその区画のどこに配置するかを示します。
拡大
ブール値、0または1
塗りつぶし
有効な値:'x''y''both''none'
ipadxとipady
距離-スレーブウィジェットの両側にある内部パディングを指定します。
padxとpady
距離-スレーブウィジェットの両側に外部パディングを指定します。
有効な値は、'left''right''top''bottom'です。


ウィジェット変数の結合

一部のウィジェット(テキスト入力ウィジェットなど)の現在の値の設定は、特別なオプションを使用してアプリケーション変数に直接接続できます。 これらのオプションは、variabletextvariableonvalueoffvalue、およびvalueです。 この接続は両方の方法で機能します。何らかの理由で変数が変更された場合、接続先のウィジェットは新しい値を反映するように更新されます。

残念ながら、 tkinter の現在の実装では、variableまたはtextvariableオプションを介して任意のPython変数をウィジェットに渡すことはできません。 これが機能する変数の種類は、 tkinter で定義されているVariableというクラスからサブクラス化された変数のみです。

変数には、StringVarIntVarDoubleVar、およびBooleanVarという多くの便利なサブクラスがすでに定義されています。 このような変数の現在の値を読み取るには、その変数でget()メソッドを呼び出し、その値を変更するには、set()メソッドを呼び出します。 このプロトコルに従うと、ウィジェットは常に変数の値を追跡し、それ以上の介入はありません。

例えば:

import tkinter as tk

class App(tk.Frame):
    def __init__(self, master):
        super().__init__(master)
        self.pack()

        self.entrythingy = tk.Entry()
        self.entrythingy.pack()

        # Create the application variable.
        self.contents = tk.StringVar()
        # Set it to some value.
        self.contents.set("this is a variable")
        # Tell the entry widget to watch this variable.
        self.entrythingy["textvariable"] = self.contents

        # Define a callback for when the user hits return.
        # It prints the current value of the variable.
        self.entrythingy.bind('<Key-Return>',
                             self.print_contents)

    def print_contents(self, event):
        print("Hi. The current entry content is:",
              self.contents.get())

root = tk.Tk()
myapp = App(root)
myapp.mainloop()

ウィンドウマネージャー

Tkには、ウィンドウマネージャーと対話するためのユーティリティコマンドwmがあります。 wmコマンドのオプションを使用すると、タイトル、配置、アイコンビットマップなどを制御できます。 tkinter では、これらのコマンドはWmクラスのメソッドとして実装されています。 トップレベルウィジェットはWmクラスからサブクラス化されているため、Wmメソッドを直接呼び出すことができます。

特定のウィジェットを含むトップレベルウィンドウにアクセスするには、多くの場合、ウィジェットのマスターを参照するだけです。 もちろん、ウィジェットがフレーム内にパックされている場合、マスターはトップレベルウィンドウを表しません。 任意のウィジェットを含むトップレベルウィンドウにアクセスするには、_root()メソッドを呼び出すことができます。 このメソッドは、この関数が実装の一部であり、Tk機能へのインターフェイスではないことを示すアンダースコアで始まります。

典型的な使用法のいくつかの例を次に示します。

import tkinter as tk

class App(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.pack()

# create the application
myapp = App()

#
# here are method calls to the window manager class
#
myapp.master.title("My Do-Nothing Application")
myapp.master.maxsize(1000, 400)

# start the program
myapp.mainloop()

Tkオプションのデータ型

アンカー

法定値はコンパスのポイントです:"n""ne""e""se""s""sw""w""nw"、および"center"

ビットマップ

名前付きビットビットには、'error''gray25''gray50''hourglass''info'、 [X100Xの8つが組み込まれています。 ]、'question''warning'。 Xビットマップファイル名を指定するには、"@/usr/contrib/bitmap/gumby.bit"のように、ファイルへのフルパスを@で始まるように指定します。

ブール値

整数0または1、あるいは文字列"yes"または"no"を渡すことができます。

折り返し電話

これは、引数をとらないPython関数です。 例えば:

def print_it():
    print("hi there")
fred["command"] = print_it

色は、rgb.txtファイルのX色の名前として、または4ビットのRGB値を表す文字列として指定できます:"#RGB"、8ビット:"#RRGGBB"、12ビット」"#RRRGGGBBB"、または16ビット"#RRRRGGGGBBBB"の範囲。ここで、R、G、Bは任意の有効な16進数字を表します。 詳細については、Ousterhoutの本の160ページを参照してください。

カーソル

cursorfont.hの標準Xカーソル名は、XC_プレフィックスなしで使用できます。 たとえば、ハンドカーソル(XC_hand2)を取得するには、文字列"hand2"を使用します。 独自のビットマップとマスクファイルを指定することもできます。 Ousterhoutの本の179ページを参照してください。

距離

画面の距離は、ピクセルまたは絶対距離のいずれかで指定できます。 ピクセルは数値で示され、絶対距離は文字列で示され、末尾の文字は単位を示します。センチメートルの場合はc、インチの場合はi、ミリメートルの場合はm、 [X187X ]プリンタのポイント。 たとえば、3.5インチは"3.5i"として表されます。

フォント

Tkは、{courier 10 bold}などのリストフォント名形式を使用します。 正の数のフォントサイズはポイントで測定されます。 負の数のサイズはピクセル単位で測定されます。

ジオメトリ

これはwidthxheightの形式の文字列で、幅と高さはほとんどのウィジェットのピクセル単位(テキストを表示するウィジェットの文字数)で測定されます。 例:fred["geometry"] = "200x100"

正当化する

有効な値は、"left""center""right"、および"fill"の文字列です。

領域

これは、スペースで区切られた4つの要素を持つ文字列であり、それぞれが有効な距離です(上記を参照)。 例:"2 3 4 5""3i 2i 4.5i 2i""3c 2c 4c 10.43c"はすべて合法的な地域です。

安心

ウィジェットの境界線スタイルを決定します。 有効な値は、"raised""sunken""flat""groove"、および"ridge"です。

scrollcommand

これはほとんどの場合、一部のスクロールバーウィジェットのset()メソッドですが、単一の引数を取る任意のウィジェットメソッドにすることができます。

包む

"none""char"、または"word"のいずれかである必要があります。


バインディングとイベント

ウィジェットコマンドのbindメソッドを使用すると、特定のイベントを監視し、そのイベントタイプが発生したときにコールバック関数をトリガーできます。 bindメソッドの形式は次のとおりです。

def bind(self, sequence, func, add=''):

どこ:

順序
イベントのターゲットの種類を示す文字列です。 (詳細については、バインドマンページとジョンオースターハウトの本の201ページを参照してください)。
func
はPython関数であり、1つの引数を取り、イベントが発生したときに呼び出されます。 イベントインスタンスが引数として渡されます。 (この方法でデプロイされた関数は、一般にコールバックとして知られています。)
追加
または'+'のいずれかはオプションです。 空の文字列を渡すことは、このバインディングが、このイベントが関連付けられている他のバインディングを置き換えることを意味します。 '+'を渡すことは、この関数がこのイベントタイプにバインドされた関数のリストに追加されることを意味します。

例えば:

def turn_red(self, event):
    event.widget["activeforeground"] = "red"

self.button.bind("<Enter>", self.turn_red)

turn_red()コールバックでイベントのウィジェットフィールドにアクセスしていることに注目してください。 このフィールドには、Xイベントをキャッチしたウィジェットが含まれています。 次の表に、アクセスできる他のイベントフィールドと、それらがTkでどのように示されるかを示します。これは、Tkのマニュアルページを参照するときに役立ちます。

Tk Tkinterイベントフィールド Tk Tkinterイベントフィールド
%f 集中 %NS char
%NS 身長 %E send_event
%k キーコード %K keysym
%s %NS keysym_num
%NS 時間 %NS タイプ
%w %W ウィジェット
%x x %X x_root
%y y %Y y_root


インデックスパラメータ

多くのウィジェットでは、「インデックス」パラメータを渡す必要があります。 これらは、テキストウィジェットの特定の場所、エントリウィジェットの特定の文字、またはメニューウィジェットの特定のメニュー項目を指すために使用されます。

エントリウィジェットのインデックス(インデックス、ビューインデックスなど)
エントリウィジェットには、表示されているテキスト内の文字の位置を参照するオプションがあります。 これらの tkinter 関数を使用して、テキストウィジェットのこれらの特別なポイントにアクセスできます。
テキストウィジェットのインデックス
テキストウィジェットのインデックス表記は非常に豊富で、Tkのマニュアルページで最もよく説明されています。
メニューインデックス(menu.invoke()、menu.entryconfig()など)
メニューの一部のオプションとメソッドは、特定のメニューエントリを操作します。 オプションまたはパラメータにメニューインデックスが必要な場合はいつでも、次のものを渡すことができます。
  • 0から始まる、ウィジェット内のエントリの数値位置を上から数えて参照する整数。
  • 文字列"active"。これは現在カーソルの下にあるメニュー位置を参照します。
  • 最後のメニュー項目を参照する文字列"last"
  • @6のように、@が前に付いた整数。この整数は、メニューの座標系のピクセル座標として解釈されます。
  • 文字列"none"は、メニューエントリがまったくないことを示します。ほとんどの場合、menu.activate()とともに使用され、すべてのエントリが非アクティブ化されます。最後に、
  • メニューの上部から下部に向かってスキャンされた、メニューエントリのラベルとパターンが一致するテキスト文字列。 このインデックスタイプは他のすべての後に考慮されることに注意してください。つまり、lastactive、またはnoneというラベルの付いたメニュー項目の一致は、代わりに上記のリテラルとして解釈される場合があります。 。


画像

tkinter.Imageの対応するサブクラスを使用して、さまざまな形式の画像を作成できます。

  • XBM形式の画像の場合はBitmapImage
  • PhotoImageは、PGM、PPM、GIF、およびPNG形式の画像用です。 後者はTk8.6以降でサポートされています。

どちらのタイプのイメージも、fileまたはdataオプションのいずれかを使用して作成されます(他のオプションも使用できます)。

画像オブジェクトは、imageオプションがウィジェットでサポートされている場所であればどこでも使用できます(例: ラベル、ボタン、メニュー)。 このような場合、Tkは画像への参照を保持しません。 画像オブジェクトへの最後のPython参照が削除されると、画像データも削除され、Tkは画像が使用された場所に空のボックスを表示します。

も参照してください

Pillow パッケージは、BMP、JPEG、TIFF、WebPなどの形式のサポートを追加します。


ファイルハンドラー

Tkを使用すると、ファイル記述子でI / Oが可能な場合に、Tkメインループから呼び出されるコールバック関数を登録および登録解除できます。 ファイル記述子ごとに登録できるハンドラーは1つだけです。 コード例:

import tkinter
widget = tkinter.Tk()
mask = tkinter.READABLE | tkinter.WRITABLE
widget.tk.createfilehandler(file, mask, callback)
...
widget.tk.deletefilehandler(file)

この機能はWindowsでは使用できません。

読み取りに使用できるバイト数がわからないため、 BufferedIOBase または TextIOBase read()または readlineを使用したくない場合があります。 ()メソッド。これらは事前定義されたバイト数の読み取りを要求するためです。 ソケットの場合、 recv()または recvfrom()メソッドは正常に機能します。 他のファイルの場合は、raw読み取りまたはos.read(file.fileno(), maxbytecount)を使用します。

Widget.tk.createfilehandler(file, mask, func)

ファイルハンドラコールバック関数 func を登録します。 file 引数は、 fileno()メソッドを持つオブジェクト(ファイルまたはソケットオブジェクトなど)、または整数ファイル記述子のいずれかです。 mask 引数は、以下の3つの定数のいずれかのOR演算の組み合わせです。 コールバックは次のように呼び出されます。

callback(file, mask)
Widget.tk.deletefilehandler(file)
ファイルハンドラーの登録を解除します。
tkinter.READABLE

tkinter.WRITABLE
tkinter.EXCEPTION

mask 引数で使用される定数。