migrazione verso gitea
This commit is contained in:
33
trash/async_runner.py
Normal file
33
trash/async_runner.py
Normal file
@@ -0,0 +1,33 @@
|
||||
"""Minimal bridge between Tkinter and an external asyncio loop."""
|
||||
|
||||
import asyncio
|
||||
from typing import Callable
|
||||
|
||||
|
||||
class AsyncRunner:
|
||||
"""Run coroutines on a background loop and marshal results back to Tk."""
|
||||
|
||||
def __init__(self, tk_root, loop: asyncio.AbstractEventLoop):
|
||||
"""Store the Tk root widget and the loop used for background work."""
|
||||
self.tk = tk_root
|
||||
self.loop = loop
|
||||
|
||||
def run(self, awaitable, on_ok: Callable, on_err: Callable, busy=None, message: str | None = None):
|
||||
"""Schedule an awaitable and optionally show a busy indicator."""
|
||||
if busy:
|
||||
busy.show(message or "Lavoro in corso...")
|
||||
fut = asyncio.run_coroutine_threadsafe(awaitable, self.loop)
|
||||
self._poll(fut, on_ok, on_err, busy)
|
||||
|
||||
def _poll(self, fut, on_ok, on_err, busy):
|
||||
"""Poll the future until completion and invoke the proper callback."""
|
||||
if fut.done():
|
||||
if busy:
|
||||
busy.hide()
|
||||
try:
|
||||
res = fut.result()
|
||||
on_ok(res)
|
||||
except Exception as ex:
|
||||
on_err(ex)
|
||||
return
|
||||
self.tk.after(50, lambda: self._poll(fut, on_ok, on_err, busy))
|
||||
Reference in New Issue
Block a user