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

目次

- グラフィックユーザインタフェース FAQ
  - Python のプラットフォーム非依存の GUI ツールキットには何がありますか？
    - Tkinter
    - wxWidgets
    - Qt
    - Gtk+
    - FLTK
    - OpenGL
  - Python のプラットフォーム固有の GUI ツールキットには何がありますか？
  - Tkinter の質問
    - Tkinter アプリケーションを凍結するにはどうしますか？
    - I/O を待つ間に扱われる Tk イベントを作れますか？
    - Tkinter で働くキーバインディングが得られません。なぜですか？

## Python のプラットフォーム非依存の GUI ツールキットには何がありますか？

目的のプラットフォーム (群) が何かによって、いくつかあります。この中にはまだ Python 3 に移植されていないものもあります。少なくとも Tkinter と Qt は Python 3 互換であることを確認しています。

### Tkinter

Python の標準的なビルドには、 tkinter という Tcl/Tk ウィジェットセットのオブジェクト指向インタフェースが含まれています。 これは最も簡単にインストールして使えるでしょう。 ソースへのポインタなど、 Tk に関する詳しい情報は、 Tcl/Tk のホームページ https://www.tcl.tk を参照してください。 Tcl/Tk は、Mac OS X、Windows、Unix のプラットフォームにおいて完全にポータブルです。

### wxWidgets

wxWidgets (https://www.wxwidgets.org) は、C++ で書かれたフリーでポータブルな GUI クラスライブラリで、各プラットフォームのネイティブなルックアンドフィールを提供します。現在、Windows、Mac OS X、GTK、X11 はすべて安定した対象です。言語バインディングは Python、Perl、Ruby などの言語で利用できます。

wxPython (http://www.wxpython.org) が wxWidgets の Python バインディングです。これはたいてい公式の wxWidgets より少し遅れますが、他の言語バインディングでは利用できない機能も pure Python 拡張経由でいくつか提供しています。wxPython ユーザと開発者の活発なコミュニティがあります。

wxWidgets も wxPython も、フリーなオープンソースソフトウェアであり、寛大なライセンスでフリーウェアやシェアウェアと同様に商業利用も許可されています。

### Qt

Qt ツールキットへのバインディング (PyQt または PySide) や KDE へのバインディング (PyKDE4) があります。PyQt は現在 PySide よりも発達していますが、プロプライエタリなアプリケーションを書くには Riverbank Computing から PyQt ライセンスを購入しなければなりません。PySide は全てのアプリケーションに対してフリーです。

Qt 4.5 以降は LGPL ライセンスでライセンスされています。また、商用ライセンスも The Qt Company から利用できます。

### Gtk+

Gtk+ toolkit 用の PyGtk バインディングが James Henstridge によって実装されています。<http://www.pygtk.org> を参照してください。

### FLTK

簡潔かつ強力で成熟したクロスプラットフォームウィンドウシステム the FLTK toolkit の Python バインディングが the PyFLTK project から利用できます。

### OpenGL

OpenGL のバインディングは、 PyOpenGL を参照してください。

## Python のプラットフォーム固有の GUI ツールキットには何がありますか？

PyObjc Objective-C bridge をインストールすることによって、Python プログラマは MacOS X の Cocoa ライブラリを使うことができます。

Mark Hammond による Pythonwin には Microsoft Foundation Class のインタフェースと Python プログラミング環境が含まれています。これは MFC クラスを用いて主に Python で書かれています。

## Tkinter の質問

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

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

一つの解決策は、アプリケーションに Tcl と Tk ライブラリを同梱し、環境変数 `TCL_LIBRARY` と `TK_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 オプションを参照してください)。