blob: e502ef81e855beafceb4a7adea6923d135acf2b5 [file] [log] [blame]
Georg Brandld7413152009-10-11 21:25:26 +00001:tocdepth: 2
2
3==========================
4Graphic User Interface FAQ
5==========================
6
7.. contents::
8
Georg Brandl62423cb2009-12-19 17:59:59 +00009.. XXX need review for Python 3.
10
11
Georg Brandld7413152009-10-11 21:25:26 +000012General GUI Questions
13=====================
14
15What platform-independent GUI toolkits exist for Python?
Benjamin Petersond7c3ed52010-06-27 22:32:30 +000016========================================================
Georg Brandld7413152009-10-11 21:25:26 +000017
Antoine Pitroueb50ba52011-02-05 10:43:57 +000018Depending on what platform(s) you are aiming at, there are several. Some
19of them haven't been ported to Python 3 yet. At least `Tkinter`_ and `Qt`_
20are known to be Python 3-compatible.
Georg Brandld7413152009-10-11 21:25:26 +000021
22.. XXX check links
23
24Tkinter
Benjamin Petersond7c3ed52010-06-27 22:32:30 +000025-------
Georg Brandld7413152009-10-11 21:25:26 +000026
27Standard builds of Python include an object-oriented interface to the Tcl/Tk
Antoine Pitroueb50ba52011-02-05 10:43:57 +000028widget set, called :ref:`tkinter <Tkinter>`. This is probably the easiest to
29install (since it comes included with most
30`binary distributions <http://www.python.org/download/>`_ of Python) and use.
31For more info about Tk, including pointers to the source, see the
32`Tcl/Tk home page <http://www.tcl.tk>`_. Tcl/Tk is fully portable to the
33MacOS, Windows, and Unix platforms.
Georg Brandld7413152009-10-11 21:25:26 +000034
Benjamin Petersonf6489f92009-11-25 17:46:26 +000035wxWidgets
Benjamin Petersond7c3ed52010-06-27 22:32:30 +000036---------
Georg Brandld7413152009-10-11 21:25:26 +000037
Benjamin Petersond7c3ed52010-06-27 22:32:30 +000038wxWidgets (http://www.wxwidgets.org) is a free, portable GUI class
39library written in C++ that provides a native look and feel on a
40number of platforms, with Windows, MacOS X, GTK, X11, all listed as
41current stable targets. Language bindings are available for a number
42of languages including Python, Perl, Ruby, etc.
Georg Brandld7413152009-10-11 21:25:26 +000043
Benjamin Petersond7c3ed52010-06-27 22:32:30 +000044wxPython (http://www.wxpython.org) is the Python binding for
45wxwidgets. While it often lags slightly behind the official wxWidgets
46releases, it also offers a number of features via pure Python
47extensions that are not available in other language bindings. There
48is an active wxPython user and developer community.
Benjamin Petersonf6489f92009-11-25 17:46:26 +000049
Benjamin Petersond7c3ed52010-06-27 22:32:30 +000050Both wxWidgets and wxPython are free, open source, software with
51permissive licences that allow their use in commercial products as
52well as in freeware or shareware.
53
Georg Brandld7413152009-10-11 21:25:26 +000054
55Qt
Benjamin Petersond7c3ed52010-06-27 22:32:30 +000056---
Georg Brandld7413152009-10-11 21:25:26 +000057
Antoine Pitroueb50ba52011-02-05 10:43:57 +000058There are bindings available for the Qt toolkit (using either `PyQt
59<http://www.riverbankcomputing.co.uk/software/pyqt/>`_ or `PySide
60<http://www.pyside.org/>`_) and for KDE (`PyKDE <http://www.riverbankcomputing.co.uk/software/pykde/intro>`__).
61PyQt is currently more mature than PySide, but you must buy a PyQt license from
62`Riverbank Computing <http://www.riverbankcomputing.co.uk/software/pyqt/license>`_
63if you want to write proprietary applications. PySide is free for all applications.
64
65Qt 4.5 upwards is licensed under the LGPL license; also, commercial licenses
66are available from `Nokia <http://qt.nokia.com/>`_.
Georg Brandld7413152009-10-11 21:25:26 +000067
68Gtk+
Benjamin Petersond7c3ed52010-06-27 22:32:30 +000069----
Georg Brandld7413152009-10-11 21:25:26 +000070
71PyGtk bindings for the `Gtk+ toolkit <http://www.gtk.org>`_ have been
Benjamin Petersonf6489f92009-11-25 17:46:26 +000072implemented by James Henstridge; see <http://www.pygtk.org>.
Georg Brandld7413152009-10-11 21:25:26 +000073
74FLTK
Benjamin Petersond7c3ed52010-06-27 22:32:30 +000075----
Georg Brandld7413152009-10-11 21:25:26 +000076
77Python bindings for `the FLTK toolkit <http://www.fltk.org>`_, a simple yet
78powerful and mature cross-platform windowing system, are available from `the
79PyFLTK project <http://pyfltk.sourceforge.net>`_.
80
81
82FOX
Benjamin Petersond7c3ed52010-06-27 22:32:30 +000083----
Georg Brandld7413152009-10-11 21:25:26 +000084
85A wrapper for `the FOX toolkit <http://www.fox-toolkit.org/>`_ called `FXpy
86<http://fxpy.sourceforge.net/>`_ is available. FOX supports both Unix variants
87and Windows.
88
89
90OpenGL
Benjamin Petersond7c3ed52010-06-27 22:32:30 +000091------
Georg Brandld7413152009-10-11 21:25:26 +000092
93For OpenGL bindings, see `PyOpenGL <http://pyopengl.sourceforge.net>`_.
94
95
96What platform-specific GUI toolkits exist for Python?
Benjamin Petersond7c3ed52010-06-27 22:32:30 +000097========================================================
Georg Brandld7413152009-10-11 21:25:26 +000098
99`The Mac port <http://python.org/download/mac>`_ by Jack Jansen has a rich and
100ever-growing set of modules that support the native Mac toolbox calls. The port
Benjamin Petersonf6489f92009-11-25 17:46:26 +0000101supports MacOS X's Carbon libraries.
102
103By installing the `PyObjc Objective-C bridge
104<http://pyobjc.sourceforge.net>`_, Python programs can use MacOS X's
105Cocoa libraries. See the documentation that comes with the Mac port.
Georg Brandld7413152009-10-11 21:25:26 +0000106
107:ref:`Pythonwin <windows-faq>` by Mark Hammond includes an interface to the
Benjamin Petersonf6489f92009-11-25 17:46:26 +0000108Microsoft Foundation Classes and a Python programming environment
109that's written mostly in Python using the MFC classes.
Georg Brandld7413152009-10-11 21:25:26 +0000110
111
112Tkinter questions
113=================
114
115How do I freeze Tkinter applications?
116-------------------------------------
117
118Freeze is a tool to create stand-alone applications. When freezing Tkinter
119applications, the applications will not be truly stand-alone, as the application
120will still need the Tcl and Tk libraries.
121
Benjamin Petersonf6489f92009-11-25 17:46:26 +0000122One solution is to ship the application with the Tcl and Tk libraries, and point
Georg Brandld7413152009-10-11 21:25:26 +0000123to them at run-time using the :envvar:`TCL_LIBRARY` and :envvar:`TK_LIBRARY`
124environment variables.
125
126To get truly stand-alone applications, the Tcl scripts that form the library
127have to be integrated into the application as well. One tool supporting that is
128SAM (stand-alone modules), which is part of the Tix distribution
Benjamin Petersonf6489f92009-11-25 17:46:26 +0000129(http://tix.sourceforge.net/).
130
131Build Tix with SAM enabled, perform the appropriate call to
Georg Brandl60203b42010-10-06 10:11:56 +0000132:c:func:`Tclsam_init`, etc. inside Python's
Benjamin Petersonf6489f92009-11-25 17:46:26 +0000133:file:`Modules/tkappinit.c`, and link with libtclsam and libtksam (you
134might include the Tix libraries as well).
Georg Brandld7413152009-10-11 21:25:26 +0000135
136
137Can I have Tk events handled while waiting for I/O?
138---------------------------------------------------
139
140Yes, and you don't even need threads! But you'll have to restructure your I/O
Georg Brandl60203b42010-10-06 10:11:56 +0000141code a bit. Tk has the equivalent of Xt's :c:func:`XtAddInput()` call, which allows you
Georg Brandld7413152009-10-11 21:25:26 +0000142to register a callback function which will be called from the Tk mainloop when
143I/O is possible on a file descriptor. Here's what you need::
144
145 from Tkinter import tkinter
146 tkinter.createfilehandler(file, mask, callback)
147
148The file may be a Python file or socket object (actually, anything with a
149fileno() method), or an integer file descriptor. The mask is one of the
150constants tkinter.READABLE or tkinter.WRITABLE. The callback is called as
151follows::
152
153 callback(file, mask)
154
155You must unregister the callback when you're done, using ::
156
157 tkinter.deletefilehandler(file)
158
159Note: since you don't know *how many bytes* are available for reading, you can't
160use the Python file object's read or readline methods, since these will insist
161on reading a predefined number of bytes. For sockets, the :meth:`recv` or
162:meth:`recvfrom` methods will work fine; for other files, use
163``os.read(file.fileno(), maxbytecount)``.
164
165
166I can't get key bindings to work in Tkinter: why?
167-------------------------------------------------
168
169An often-heard complaint is that event handlers bound to events with the
170:meth:`bind` method don't get handled even when the appropriate key is pressed.
171
172The most common cause is that the widget to which the binding applies doesn't
173have "keyboard focus". Check out the Tk documentation for the focus command.
174Usually a widget is given the keyboard focus by clicking in it (but not for
175labels; see the takefocus option).