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

一般的な GUI の質問

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

Standard builds of Python include an object-oriented interface to the Tcl/Tk widget set, called tkinter. This is probably the easiest to install (since it comes included with most binary distributions of Python) and use. For more info about Tk, including pointers to the source, see the Tcl/Tk home page. Tcl/Tk is fully portable to the macOS, Windows, and Unix platforms.

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

Tkinter の質問

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

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

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

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

SAM を有効にするように Tix をビルドして、Python の Modules/tkappinit.c 内部の Tclsam_init() 等への適切なコールを実行し、libtclsam と libtksam にリンクしてください (Tix ライブラリを含んでも良いです)。

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

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

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

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

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