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


一般的な GUI の質問
===================


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

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


Tkinter
-------

Python の標準的なビルドには、 tkinter という Tcl/Tk ウィジェットセット
のオブジェクト指向インタフェースが含まれています。これは最も簡単にイン
ストールして使えるでしょう (なぜなら、これは Python のほとんどの バイ
ナリディストリビューション に同梱されているからです)。ソースへのポイン
タなど、 Tk に関する詳しい情報は、 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+
----

GObject introspection bindings の Python へのバインディングで、GTK+ 3
アプリケーションがかけます。Python GTK+ 3 Tutorial もあります。

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


Kivy
----

Kivy は、デスクトップオペレーティングシステム (Windows、macOS、Linux)
とモバイルデバイス(Android、iOS)の両方をサポートするクロスプラットフォ
ームのGUIライブラリです。これはPythonとCythonで書かれており、一連のウ
ィンドウのバックエンド処理で使用できます。

Kivyは、MITライセンスで配布されるライセンスフリーでオープンソースのソ
フトウェアです。


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
オプションを参照してください)。
