グラフィックユーザインターフェース FAQ

一般的な GUI の質問

Python の GUI ツールキットには何がありますか?

Python の標準的なビルドには、 tkinter という Tcl/Tk ウィジェットセットのオブジェクト指向インターフェースが含まれています。これは最も簡単にインストールして使えるでしょう (なぜなら、これは Python のほとんどの バイナリディストリビューション に同梱されているからです)。ソースへのポインタなど、 Tk に関する詳しい情報は、 Tcl/Tk ホームページ を参照してください。 Tcl/Tk は、 macOS 、Windows 、 Unix プラットフォームに完全にポータブルです。

対象とするプラットフォームによっては他の選択肢もあります。プラットフォーム互換 および プラットフォーム固有 の GUI フレームワークのリストを python wiki で参照できます。

Tkinter の質問

Tkinter アプリケーションを凍結するにはどうしますか?

Freeze はスタンドアロンアプリケーションを生成するツールです。Tkinter アプリケーションを凍結するとき、それは Tcl と Tk ライブラリを必要とするので、真のスタンドアロンにはなりません。

一つの解決策は、アプリケーションに Tcl と Tk ライブラリを同梱し、環境変数 TCL_LIBRARYTK_LIBRARY でランタイムに指定することです。

真にスタンドアロンなアプリケーションにするためには、ライブラリを成す Tcl スクリプトもアプリケーションに統合されていなければなりません。それをサポートするツールの一つは SAM (stand-alone modules) で、Tix ディストリビューション (https://tix.sourceforge.net/) の一部です。

Build Tix with SAM enabled, perform the appropriate call to Tclsam_init(), etc. inside Python's Modules/tkappinit.c, and link with libtclsam and libtksam (you might include the Tix libraries as well).

I/O を待つ間に扱われる Tk イベントを作れますか?

Windows 以外のプラットフォームについては、はい、スレッドさえ必要ありません! ただし、I/O コードを少し再構成しなければなりません。Tk には Xt の XtAddInput() コールと同等なものがあるので、ファイルディスクリプタ上で I/O が可能なときに Tk メインループから呼ばれるコールバック関数を登録できます。 ファイルハンドラ を参照してください。

Tkinter で働くキーバインディングが得られません。なぜですか?

bind() メソッドでイベントに 結び付けられた イベントハンドラが、適切なキーが押されたときにさえハンドルされないという苦情がよく聞かれます。

最も一般的な原因は、バインディングが適用されるウィジェットが "キーボードフォーカス" を持たないことです。Tk ドキュメントでフォーカスコマンドを確認してください。通常はウィジェットの中をクリックすることでキーボードフォーカスを与えられます (ただしラベルには与えられません。takefocus オプションを参照してください)。