Contents
目的のプラットフォーム (群) が何かによって、いくつかあります。この中にはまだ Python 3 に移植されていないものもあります。少なくとも Tkinter と Qt は Python 3 互換であることを確認しています。
Python の標準的なビルドには、tkinter という Tcl/Tk ウィジェットセットのオブジェクト指向インタフェースが含まれています。これは最も簡単にインストールして使えるでしょう。ソースへのポインタなど、 Tk に関する詳しい情報は、http://www.tcl.tk の Tcl/Tk ホームページを参照してください。Tcl/Tk は、MacOS、Windows、Unix プラットフォームに完全にポータブルです。
wxWidgets (http://www.wxwidgets.org) は、C++ で書かれたフリーでポータブルな GUI クラスライブラリで、各プラットフォームのネイティブなルックアンドフィールを提供します。現在、Windows、MacOS X、GTK、X11 はすべて安定した対象です。言語バインディングは Python、Perl、Ruby などの言語で利用できます。
wxPython (http://www.wxpython.org) が wxWidgets の Python バインディングです。これはたいてい公式の wxWidgets より少し遅れますが、他の言語バインディングでは利用できない機能も pure Python 拡張経由でいくつか提供しています。 wxPython ユーザと開発者の活発なコミュニティがあります。
wxWidgets も wxPython も、フリーなオープンソースソフトウェアであり、寛大なライセンスでフリーウェアやシェアウェアと同様に商業利用も許可されています。
Qt ツールキットのバインディング (PyQt) や KDE へのバインディング (PyKDE) があります。オープンソースソフトウェアを書くには、PyQt に支払いをする必要はありませんが、プロプライエタリなアプリケーションを書くためには Riverbank Computing から PyQt ライセンスを、(Qt 4.4 までは) Trolltech <http://www.trolltech.com> _ から Qt ライセンスを購入しなければなりません。 Qt 4.5 以降は LGPL ライセンスが適用されています。
Gtk+ toolkit 用の PyGtk バインディングが James Henstridge によって実装されています。<http://www.pygtk.org> を参照してください。
簡潔かつ強力で成熟したクロスプラットフォームウィンドウシステム the FLTK toolkit の Python バインディングが the PyFLTK project から利用できます。
the FOX toolkit のラッパ FXpy が利用できます。FOX は Unix バリアントと Windows の両方をサポートします。
Jack Jansen による The Mac port には、ネイティブ Mac ツールボックスコールをサポートする豊富で発展中のモジュール群があります。このポートは MacOS X の Carbon ライブラリをサポートしています。
PyObjc Objective-C bridge をインストールすることによって、Python プログラマは MacOS X の Cocoa ライブラリを使うことができます。Mac port に付属するドキュメントを参照してください。
Mark Hammond による Pythonwin には Microsoft Foundation Class のインタフェースと Python プログラミング環境が含まれています。これは MFC クラスを用いて主に Python で書かれています。
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 には Xt の XtAddInput() コールと同等なものがあるので、ファイルディスクリプタ上で I/O が可能なときに Tk メインループから呼ばれるコールバック関数を登録できます。このようにすればいいです:
from Tkinter import tkinter
tkinter.createfilehandler(file, mask, callback)
file には Python ファイルかソケットオブジェクト(実際には、fileno() メソッドを持った何か)、または整数のファイルディスクリプタを指定できます。 mask は定数 tkinter.READABLE または tkinter.WRITABLE のどちらかです。 callback は以下のように呼び出されます:
callback(file, mask)
callback が完了したら、次のように登録を解除しなければなりません:
tkinter.deletefilehandler(file)
ノート: 読み込みに使える バイト数 がわからないので、指定されたバイト数を読み込む Python のファイルオブジェクトの read や readline メソッドを使うことはできません。ソケットには、recv() や recvfrom() メソッドを使うといいです。その他のファイルには、os.read(file.fileno(), maxbytecount) を使ってください。
bind() メソッドでイベントに結び付けられたイベントハンドラが、適切なキーが押されたときにさえハンドルされないという苦情がよく聞かれます。
最も一般的な原因は、バインディングが適用されるウィジェットが “キーボードフォーカス” を持たないことです。Tk ドキュメントでフォーカスコマンドを確認してください。通常はウィジェットの中をクリックすることでキーボードフォーカスを与えられます (ただしラベルには与えられません。takefocus オプションを参照してください)。