Server IP : 85.214.239.14 / Your IP : 3.145.79.214 Web Server : Apache/2.4.62 (Debian) System : Linux h2886529.stratoserver.net 4.9.0 #1 SMP Tue Jan 9 19:45:01 MSK 2024 x86_64 User : www-data ( 33) PHP Version : 7.4.18 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare, MySQL : OFF | cURL : OFF | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : OFF Directory : /usr/share/doc/python/faq/ |
Upload File : |
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="generator" content="Docutils 0.12: http://docutils.sourceforge.net/" /> <title>Graphic User Interface FAQ</title> <meta name="date" content="2003-09-04" /> <style type="text/css"> /* :Author: David Goodger (goodger@python.org) :Id: $Id: html4css1.css 7614 2013-02-21 15:55:51Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to customize this style sheet. */ /* used to remove borders from tables and images */ .borderless, table.borderless td, table.borderless th { border: 0 } table.borderless td, table.borderless th { /* Override padding for "table.docutils td" with "! important". The right padding separates the table cells. */ padding: 0 0.5em 0 0 ! important } .first { /* Override more specific margin styles with "! important". */ margin-top: 0 ! important } .last, .with-subtitle { margin-bottom: 0 ! important } .hidden { display: none } a.toc-backref { text-decoration: none ; color: black } blockquote.epigraph { margin: 2em 5em ; } dl.docutils dd { margin-bottom: 0.5em } object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] { overflow: hidden; } /* Uncomment (and remove this text!) to get bold-faced definition list terms dl.docutils dt { font-weight: bold } */ div.abstract { margin: 2em 5em } div.abstract p.topic-title { font-weight: bold ; text-align: center } div.admonition, div.attention, div.caution, div.danger, div.error, div.hint, div.important, div.note, div.tip, div.warning { margin: 2em ; border: medium outset ; padding: 1em } div.admonition p.admonition-title, div.hint p.admonition-title, div.important p.admonition-title, div.note p.admonition-title, div.tip p.admonition-title { font-weight: bold ; font-family: sans-serif } div.attention p.admonition-title, div.caution p.admonition-title, div.danger p.admonition-title, div.error p.admonition-title, div.warning p.admonition-title, .code .error { color: red ; font-weight: bold ; font-family: sans-serif } /* Uncomment (and remove this text!) to get reduced vertical space in compound paragraphs. div.compound .compound-first, div.compound .compound-middle { margin-bottom: 0.5em } div.compound .compound-last, div.compound .compound-middle { margin-top: 0.5em } */ div.dedication { margin: 2em 5em ; text-align: center ; font-style: italic } div.dedication p.topic-title { font-weight: bold ; font-style: normal } div.figure { margin-left: 2em ; margin-right: 2em } div.footer, div.header { clear: both; font-size: smaller } div.line-block { display: block ; margin-top: 1em ; margin-bottom: 1em } div.line-block div.line-block { margin-top: 0 ; margin-bottom: 0 ; margin-left: 1.5em } div.sidebar { margin: 0 0 0.5em 1em ; border: medium outset ; padding: 1em ; background-color: #ffffee ; width: 40% ; float: right ; clear: right } div.sidebar p.rubric { font-family: sans-serif ; font-size: medium } div.system-messages { margin: 5em } div.system-messages h1 { color: red } div.system-message { border: medium outset ; padding: 1em } div.system-message p.system-message-title { color: red ; font-weight: bold } div.topic { margin: 2em } h1.section-subtitle, h2.section-subtitle, h3.section-subtitle, h4.section-subtitle, h5.section-subtitle, h6.section-subtitle { margin-top: 0.4em } h1.title { text-align: center } h2.subtitle { text-align: center } hr.docutils { width: 75% } img.align-left, .figure.align-left, object.align-left { clear: left ; float: left ; margin-right: 1em } img.align-right, .figure.align-right, object.align-right { clear: right ; float: right ; margin-left: 1em } img.align-center, .figure.align-center, object.align-center { display: block; margin-left: auto; margin-right: auto; } .align-left { text-align: left } .align-center { clear: both ; text-align: center } .align-right { text-align: right } /* reset inner alignment in figures */ div.align-right { text-align: inherit } /* div.align-center * { */ /* text-align: left } */ ol.simple, ul.simple { margin-bottom: 1em } ol.arabic { list-style: decimal } ol.loweralpha { list-style: lower-alpha } ol.upperalpha { list-style: upper-alpha } ol.lowerroman { list-style: lower-roman } ol.upperroman { list-style: upper-roman } p.attribution { text-align: right ; margin-left: 50% } p.caption { font-style: italic } p.credits { font-style: italic ; font-size: smaller } p.label { white-space: nowrap } p.rubric { font-weight: bold ; font-size: larger ; color: maroon ; text-align: center } p.sidebar-title { font-family: sans-serif ; font-weight: bold ; font-size: larger } p.sidebar-subtitle { font-family: sans-serif ; font-weight: bold } p.topic-title { font-weight: bold } pre.address { margin-bottom: 0 ; margin-top: 0 ; font: inherit } pre.literal-block, pre.doctest-block, pre.math, pre.code { margin-left: 2em ; margin-right: 2em } pre.code .ln { color: grey; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } pre.code .literal.string, code .literal.string { color: #0C5404 } pre.code .name.builtin, code .name.builtin { color: #352B84 } pre.code .deleted, code .deleted { background-color: #DEB0A1} pre.code .inserted, code .inserted { background-color: #A3D289} span.classifier { font-family: sans-serif ; font-style: oblique } span.classifier-delimiter { font-family: sans-serif ; font-weight: bold } span.interpreted { font-family: sans-serif } span.option { white-space: nowrap } span.pre { white-space: pre } span.problematic { color: red } span.section-subtitle { /* font-size relative to parent (h1..h6 element) */ font-size: 80% } table.citation { border-left: solid 1px gray; margin-left: 1px } table.docinfo { margin: 2em 4em } table.docutils { margin-top: 0.5em ; margin-bottom: 0.5em } table.footnote { border-left: solid 1px black; margin-left: 1px } table.docutils td, table.docutils th, table.docinfo td, table.docinfo th { padding-left: 0.5em ; padding-right: 0.5em ; vertical-align: top } table.docutils th.field-name, table.docinfo th.docinfo-name { font-weight: bold ; text-align: left ; white-space: nowrap ; padding-left: 0 } /* "booktabs" style (no vertical lines) */ table.docutils.booktabs { border: 0px; border-top: 2px solid; border-bottom: 2px solid; border-collapse: collapse; } table.docutils.booktabs * { border: 0px; } table.docutils.booktabs th { border-bottom: thin solid; text-align: left; } h1 tt.docutils, h2 tt.docutils, h3 tt.docutils, h4 tt.docutils, h5 tt.docutils, h6 tt.docutils { font-size: 100% } ul.auto-toc { list-style-type: none } </style> </head> <body> <div class="document" id="graphic-user-interface-faq"> <h1 class="title">Graphic User Interface FAQ</h1> <table class="docinfo" frame="void" rules="none"> <col class="docinfo-name" /> <col class="docinfo-content" /> <tbody valign="top"> <tr><th class="docinfo-name">Date:</th> <td>2003-09-04</td></tr> <tr><th class="docinfo-name">Version:</th> <td>6607</td></tr> <tr class="field"><th class="docinfo-name">Web site:</th><td class="field-body"><a class="reference external" href="http://www.python.org/">http://www.python.org/</a></td> </tr> </tbody> </table> <div class="contents topic" id="contents"> <p class="topic-title first">Contents</p> <ul class="auto-toc simple"> <li><a class="reference internal" href="#general-gui-questions" id="id1">1 General GUI Questions</a><ul class="auto-toc"> <li><a class="reference internal" href="#what-platform-independent-gui-toolkits-exist-for-python" id="id2">1.1 What platform-independent GUI toolkits exist for Python?</a><ul class="auto-toc"> <li><a class="reference internal" href="#tkinter" id="id3">1.1.1 Tkinter</a></li> <li><a class="reference internal" href="#wxwindows" id="id4">1.1.2 wxWindows</a></li> <li><a class="reference internal" href="#qt" id="id5">1.1.3 Qt</a></li> <li><a class="reference internal" href="#gtk" id="id6">1.1.4 GTk+</a></li> <li><a class="reference internal" href="#fltk" id="id7">1.1.5 FLTK</a></li> <li><a class="reference internal" href="#fox" id="id8">1.1.6 FOX</a></li> <li><a class="reference internal" href="#opengl" id="id9">1.1.7 OpenGL</a></li> </ul> </li> <li><a class="reference internal" href="#what-platform-specific-gui-toolkits-exist-for-python" id="id10">1.2 What platform-specific GUI toolkits exist for Python?</a></li> </ul> </li> <li><a class="reference internal" href="#tkinter-questions" id="id11">2 Tkinter questions</a><ul class="auto-toc"> <li><a class="reference internal" href="#how-do-i-freeze-tkinter-applications" id="id12">2.1 How do I freeze Tkinter applications?</a></li> <li><a class="reference internal" href="#can-i-have-tk-events-handled-while-waiting-for-i-o" id="id13">2.2 Can I have Tk events handled while waiting for I/O?</a></li> <li><a class="reference internal" href="#i-can-t-get-key-bindings-to-work-in-tkinter-why" id="id14">2.3 I can't get key bindings to work in Tkinter: why?</a></li> </ul> </li> </ul> </div> <div class="section" id="general-gui-questions"> <h1><a class="toc-backref" href="#id1">1 General GUI Questions</a></h1> <div class="section" id="what-platform-independent-gui-toolkits-exist-for-python"> <h2><a class="toc-backref" href="#id2">1.1 What platform-independent GUI toolkits exist for Python?</a></h2> <p>Depending on what platform(s) you are aiming at, there are several.</p> <div class="section" id="tkinter"> <h3><a class="toc-backref" href="#id3">1.1.1 Tkinter</a></h3> <p>Standard builds of Python include an object-oriented interface to the Tcl/Tk widget set, called Tkinter. This is probably the easiest to install and use. For more info about Tk, including pointers to the source, see the Tcl/Tk home page at <a class="reference external" href="http://www.tcl.tk">http://www.tcl.tk</a>. Tcl/Tk is fully portable to the MacOS, Windows, and Unix platforms.</p> </div> <div class="section" id="wxwindows"> <h3><a class="toc-backref" href="#id4">1.1.2 wxWindows</a></h3> <p>wxWindows is a portable GUI class library written in C++ that's a portable interface to various platform-specific libraries; wxPython is a Python interface to wxWindows. wxWindows supports Windows and MacOS; on Unix variants, it supports both GTk+ and Motif toolkits. wxWindows preserves the look and feel of the underlying graphics toolkit, and there is quite a rich widget set and collection of GDI classes. See <a class="reference external" href="http://www.wxwindows.org">the wxWindows page</a> for more details.</p> <p><a class="reference external" href="http://alldunn.com/wxPython">wxPython</a> is an extension module that wraps many of the wxWindows C++ classes, and is quickly gaining popularity amongst Python developers. You can get wxPython as part of the source or CVS distribution of wxWindows, or directly from its home page.</p> </div> <div class="section" id="qt"> <h3><a class="toc-backref" href="#id5">1.1.3 Qt</a></h3> <p>There are bindings available for the Qt toolkit (<a class="reference external" href="http://www.riverbankcomputing.co.uk/pyqt/">PyQt</a>) and for KDE (PyKDE). If you're writing open source software, you don't need to pay for PyQt, but if you want to write proprietary applications, you must buy a PyQt license from <a class="reference external" href="http://www.riverbankcomputing.co.uk">Riverbank Computing</a> and a Qt license from <a class="reference external" href="http://www.trolltech.com">Trolltech</a>.</p> </div> <div class="section" id="gtk"> <h3><a class="toc-backref" href="#id6">1.1.4 GTk+</a></h3> <p>PyGTk bindings for the <a class="reference external" href="http://www.gtk.org">GTk+ toolkit</a> have been implemented by by James Henstridge; see <a class="reference external" href="ftp://ftp.gtk.org/pub/gtk/python/">ftp://ftp.gtk.org/pub/gtk/python/</a>.</p> </div> <div class="section" id="fltk"> <h3><a class="toc-backref" href="#id7">1.1.5 FLTK</a></h3> <p>Python bindings for <a class="reference external" href="http://www.fltk.org">the FLTK toolkit</a>, a simple yet powerful and mature cross-platform windowing system, are available from <a class="reference external" href="http://pyfltk.sourceforge.net">the PyFLTK project</a>.</p> </div> <div class="section" id="fox"> <h3><a class="toc-backref" href="#id8">1.1.6 FOX</a></h3> <p>A wrapper for <a class="reference external" href="http://www.fox-toolkit.org/">the FOX toolkit</a> called <a class="reference external" href="http://fxpy.sourceforge.net/">FXpy</a> is available. FOX supports both Unix variants and Windows.</p> </div> <div class="section" id="opengl"> <h3><a class="toc-backref" href="#id9">1.1.7 OpenGL</a></h3> <p>For OpenGL bindings, see <a class="reference external" href="http://pyopengl.sourceforge.net">PyOpenGL</a>.</p> </div> </div> <div class="section" id="what-platform-specific-gui-toolkits-exist-for-python"> <h2><a class="toc-backref" href="#id10">1.2 What platform-specific GUI toolkits exist for Python?</a></h2> <p><a class="reference external" href="http://www.python.org/download/download_mac.html">The Mac port</a> by Jack Jansen has a rich and ever-growing set of modules that support the native Mac toolbox calls. The port includes support for MacOS9 and MacOS X's Carbon libraries. By installing the <a class="reference external" href="http://pyobjc.sourceforge.net">PyObjc Objective-C bridge</a>, Python programs can use MacOS X's Cocoa libraries. See the documentation that comes with the Mac port.</p> <p><a class="reference external" href="http://www.python.org/windows">Pythonwin</a> by Mark Hammond includes an interface to the Microsoft Foundation Classes and a Python programming environment using it that's written mostly in Python.</p> </div> </div> <div class="section" id="tkinter-questions"> <h1><a class="toc-backref" href="#id11">2 Tkinter questions</a></h1> <div class="section" id="how-do-i-freeze-tkinter-applications"> <h2><a class="toc-backref" href="#id12">2.1 How do I freeze Tkinter applications?</a></h2> <p>Freeze is a tool to create stand-alone applications. When freezing Tkinter applications, the applications will not be truly stand-alone, as the application will still need the Tcl and Tk libraries.</p> <p>One solution is to ship the application with the tcl and tk libraries, and point to them at run-time using the TCL_LIBRARY and TK_LIBRARY environment variables.</p> <p>To get truly stand-alone applications, the Tcl scripts that form the library have to be integrated into the application as well. One tool supporting that is SAM (stand-alone modules), which is part of the Tix distribution (<a class="reference external" href="http://tix.mne.com">http://tix.mne.com</a>). Build Tix with SAM enabled, perform the appropriate call to Tclsam_init etc inside Python's Modules/tkappinit.c, and link with libtclsam and libtksam (you might include the Tix libraries as well).</p> </div> <div class="section" id="can-i-have-tk-events-handled-while-waiting-for-i-o"> <h2><a class="toc-backref" href="#id13">2.2 Can I have Tk events handled while waiting for I/O?</a></h2> <p>Yes, and you don't even need threads! But you'll have to restructure your I/O code a bit. Tk has the equivalent of Xt's XtAddInput() call, which allows you to register a callback function which will be called from the Tk mainloop when I/O is possible on a file descriptor. Here's what you need:</p> <pre class="literal-block"> from Tkinter import tkinter tkinter.createfilehandler(file, mask, callback) </pre> <p>The file may be a Python file or socket object (actually, anything with a fileno() method), or an integer file descriptor. The mask is one of the constants tkinter.READABLE or tkinter.WRITABLE. The callback is called as follows:</p> <pre class="literal-block"> callback(file, mask) </pre> <p>You must unregister the callback when you're done, using</p> <pre class="literal-block"> tkinter.deletefilehandler(file) </pre> <p>Note: since you don't know <em>how many bytes</em> are available for reading, you can't use the Python file object's read or readline methods, since these will insist on reading a predefined number of bytes. For sockets, the recv() or recvfrom() methods will work fine; for other files, use os.read(file.fileno(), maxbytecount).</p> </div> <div class="section" id="i-can-t-get-key-bindings-to-work-in-tkinter-why"> <h2><a class="toc-backref" href="#id14">2.3 I can't get key bindings to work in Tkinter: why?</a></h2> <p>An often-heard complaint is that event handlers bound to events with the bind() method don't get handled even when the appropriate key is pressed.</p> <p>The most common cause is that the widget to which the binding applies doesn't have "keyboard focus". Check out the Tk documentation for the focus command. Usually a widget is given the keyboard focus by clicking in it (but not for labels; see the takefocus option).</p> </div> </div> </div> </body> </html>