Welcome, guest | Sign In | My Account | Store | Cart

Notice! PyPM is being replaced with the ActiveState Platform, which enhances PyPM’s build and deploy capabilities. Create your free Platform account to download ActivePython or customize Python with the packages you require and get automatic updates.

Download
ActivePython
INSTALL>
pypm install async-gui

How to install async_gui

  1. Download and install ActivePython
  2. Open Command Prompt
  3. Type pypm install async-gui
 Python 2.7Python 3.2Python 3.3
Windows (32-bit)
Windows (64-bit)
Mac OS X (10.5+)
0.1.0 Available View build log
Linux (32-bit)
0.1.0 Available View build log
Linux (64-bit)
0.1.0 Available View build log
0.1.0 Available View build log
 
License
BSD License
Dependencies
Lastest release
version 0.1.0 on Apr 7th, 2013

async_gui

async_gui is a library aimed to make use of threads in GUI applications simpler. It's inspired by PyCon talk Using futures for async GUI programming in Python 3.3 and tornado @gen.engine implementation.

Most of GUI toolkits don't allow you to access graphical elements from non-GUI thread. Python 3.2+ has nice new feature concurrent.futures, but we can't just wait for result from future and callbacks are not very handy.

Combination of Coroutines via Enhanced Generators (PEP-342) and futures creates a rich and easy to use asynchronous programming model which can be used for creating highly responsive GUI applications.

Example

Demo of button click handler:

System Message: ERROR/3 (<string>, line 23)

Unknown directive type "code-block".

.. code-block:: python

    @engine.async
    def on_button_click(self, *args):
        self.status_label.setText("Downloading image...")
        # Run single task in separate thread
        image_data = yield Task(self.load_url,
                                "http://www.google.com/images/srpr/logo4w.png")
        pixmap = QtGui.QPixmap.fromImage(QtGui.QImage.fromData(image_data))
        self.image_label.setPixmap(pixmap)
        self.status_label.setText("Downloading pages...")
        urls = ['http://www.google.com',
                'http://www.yandex.ru',
                'http://www.python.org']
        # Run multiple task simultaneously in thread pool
        pages = yield [Task(self.load_url, url) for url in urls]
        self.status_label.setText("Done")
        avg_size = sum(map(len, pages)) / len(pages)
        self.result_label.setText("Average page size: %s" % avg_size)


Tasks yielded from on_button_click() executed in thread pool, but GUI updates done in the GUI thread. For CPU-bound applications there is also ability to run tasks in pool of processes.

See full example in examples directory.

Features

  • Python 2.7+ (futures required), Python 3+ support
  • PyQt4/PySide, Tk, Wx, Gtk GUI toolkits support. Easy to add another
  • Can execute tasks in Thread, Process, Greenlet (gevent required)
  • Possibility to run multiple tasks at the same time
  • Straightforward exception handling
  • Full test coverage

Installation

Using pip:

$ pip install async_gui

Or download, unpack and:

$ python setup.py install

To run tests use:

$ python setup.py test

History

0.1.0 (2013-0x-xx)
  • initial PyPI release

Subscribe to package updates

Last updated Apr 7th, 2013

What does the lock icon mean?

Builds marked with a lock icon are only available via PyPM to users with a current ActivePython Business Edition subscription.

Need custom builds or support?

ActivePython Enterprise Edition guarantees priority access to technical support, indemnification, expert consulting and quality-assured language builds.

Plan on re-distributing ActivePython?

Get re-distribution rights and eliminate legal risks with ActivePython OEM Edition.