Skip to main content

Asynchronous mainloop implementation for tkinter

Reason this release was yanked:

Prerelease

Project description

Asynchronous Tkinter Mainloop

Python package

Implementation of asynchronous mainloop for tkinter, the use of which allows using async handler functions. It is intended to be as simple to use as possible. No fancy unusual syntax or constructions - just use an alternative function instead of root.mainloop() and wrap asynchronous handlers into helper functions.

Based on ideas from:

Installation

Release version

Install the package with the following command:

pip install async-tkinter-loop

or

pip install async-tkinter-loop[examples]
  • [examples] part is needed to install optional dependencies (such as aiohttp and pillow) to run some of the examples. If you're not going to run examples, remove the [examples] part from the command
  • Use pip3 instead of pip on Linux systems to install the package for python3 (not python2)
  • Probably you'll want to create a virtual environment for experiments with this library, but this is optional.
  • If you want to try examples, download the entire repository as an archive (green "code" button on the github page → "Download ZIP"), unpack, run any example (of course, you need to install optional dependencies)

Development version

  1. Install Poetry, e.g., with pip install poetry (pip3 install poetry) command (other possible ways of installation see here)
  2. Download and unpack or clone the repository.
  3. Run the command poetry install or poetry install -E examples (the later command installs optional dependencies needed to run some of the examples). This command will create .venv directory with a virtual environment and install dependencies into it.
    • Run any example with poetry run python examples/sparks.py (insert a file name of an example).
    • Or activate the virtual environment and run an example with python examples/sparks.py command. You can also open the directory with the project in some IDE (e.g., PyCharm or VS Code) and select Python interpreter from the virtual environment as a project interpreter, then run examples directly from the IDE.

Some examples

Basic example:

import asyncio
import tkinter as tk

from async_tkinter_loop import async_mainloop, async_command


async def counter():
    i = 0
    while True:
        i += 1
        label['text'] = str(i)
        await asyncio.sleep(1.0)


root = tk.Tk()

label = tk.Label(root)
label.pack()

tk.Button(root, text="Start", command=async_command(counter)).pack()

async_mainloop(root)

A more practical example, downloading an image from the Internet with aiohttp and displaying it in the Tkinter window:

import tkinter as tk
from io import BytesIO

import aiohttp
from PIL import Image, ImageTk

from async_tkinter_loop import async_mainloop, async_command


async def load_image(url):
    button['state'] = 'disabled'
    label['image'] = ''
    label['text'] = 'Loading...'

    async with aiohttp.ClientSession() as session:
        response = await session.get(url)
        if response.status != 200:
            label['text'] = f'HTTP error {response.status}'
        else:
            content = await response.content.read()
            pil_image = Image.open(BytesIO(content))
            image = ImageTk.PhotoImage(pil_image)
            label.config(image=image, text='')
            label.image = image
            button['state'] = 'normal'


url = "https://picsum.photos/800/640"

root = tk.Tk()
root.geometry("800x640")

button = tk.Button(root, text='Load an image', command=async_command(load_image, url))
button.pack()

label = tk.Label(root)
label.pack(expand=1, fill=tk.BOTH)

if __name__ == "__main__":
    async_mainloop(root)

More examples see in the examples directory.

Similar projects

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

async-tkinter-loop-0.1.0rc1.tar.gz (5.2 kB view hashes)

Uploaded Source

Built Distribution

async_tkinter_loop-0.1.0rc1-py3-none-any.whl (5.0 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page