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

目次

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

  - 一般的な GUI の質問

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

  - Tkinter の質問

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

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

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

## 一般的な 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_LIBRARY` と `TK_LIBRARY` でランタイムに指定することです。

真にスタンドアロンなアプリケーションにするためには、ライブラリを成す Tcl スクリプトもアプリケーションに統合されていなければなりません。それをサポートするツールの一つは SAM (stand-alone modules) で、Tix ディストリビューション (https://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 オプションを参照してください)。