Skip to main content

Asynchronous mainloop implementation for tkinter

Project description

Asynchronous Tkinter Mainloop

Python tests Coverage Status Maintainability PyPI Supported Python versions

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 a helper function.

Please, fill free to report bugs, add pull requests or share your thoughts / ask questions, etc. about the module.

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 httpx 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 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 with poetry shell 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_handler, async_mainloop


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


root = tk.Tk()

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

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

async_mainloop(root)

Also, async_handler function can be used as a decorator (but it makes a decorated function syncroneous):

import asyncio
import tkinter as tk

from async_tkinter_loop import async_handler, async_mainloop


@async_handler
async def counter():
    i = 0
    while True:
        i += 1
        label.config(text=str(i))
        await asyncio.sleep(1.0)


root = tk.Tk()

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

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

async_mainloop(root)

A more practical example, downloading an image from the Internet with httpx (you can use aiohttp as well) and displaying it in the Tkinter window:

import tkinter as tk
from io import BytesIO

import httpx
from PIL import Image, ImageTk

from async_tkinter_loop import async_handler, async_mainloop


async def load_image(url):
    button.config(state=tk.DISABLED)
    label.config(text="Loading...", image="")

    async with httpx.AsyncClient() as client:
        response = await client.get(url, follow_redirects=True)
        if response.status_code != 200:
            label.config(text=f"HTTP error {response.status_code}")
        else:
            content = response.content
            pil_image = Image.open(BytesIO(content))
            image = ImageTk.PhotoImage(pil_image)
            label.image = image
            label.config(image=image, text="")
            button.config(state=tk.NORMAL)


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

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

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

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

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.8.1.tar.gz (4.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

async_tkinter_loop-0.8.1-py3-none-any.whl (5.3 kB view details)

Uploaded Python 3

File details

Details for the file async_tkinter_loop-0.8.1.tar.gz.

File metadata

  • Download URL: async_tkinter_loop-0.8.1.tar.gz
  • Upload date:
  • Size: 4.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.4.2 CPython/3.7.16 Linux/5.15.0-1035-azure

File hashes

Hashes for async_tkinter_loop-0.8.1.tar.gz
Algorithm Hash digest
SHA256 fbd02f9d821931609ba4210a75b21a77253cce0c94956fdf4586320cec40cde8
MD5 2b6cf3438030893641e2f96d71ae09a7
BLAKE2b-256 d0f6045cbf0e69c17060df38db5a8c4b0b47ea4883df7bc0989329a6c856d3a2

See more details on using hashes here.

File details

Details for the file async_tkinter_loop-0.8.1-py3-none-any.whl.

File metadata

  • Download URL: async_tkinter_loop-0.8.1-py3-none-any.whl
  • Upload date:
  • Size: 5.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.4.2 CPython/3.7.16 Linux/5.15.0-1035-azure

File hashes

Hashes for async_tkinter_loop-0.8.1-py3-none-any.whl
Algorithm Hash digest
SHA256 4b29dc003e7d72b62141587f92f17c9bd15e035cfbe7c15eedd81a8b8ce4f420
MD5 7dfefcce182f574b69445facbd3cd286
BLAKE2b-256 d2d1fbf91e8d72ace41ecf0d3cce38b54dbe61229aaa0e63b703f96ce4d6f784

See more details on using hashes here.

Supported by

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