Python 3.4 / GTK / Async

人走茶凉 提交于 2019-12-22 12:38:31

问题


I use tkinter with a async funktion.

Now I will use gtk3 in stead of tkinkter.

Is there also a way to run my async function?

How should I adapt the code

Here are some code fragments:

async def _event_loop(app, interval=0.05):
    try:
        while True:
            app.update()
            await asyncio.sleep(interval)
    except tkinter.TclError as exc:
        if "application has been destroyed" not in exc.args[0]:
            raise

class SSHFrame(tkinter.Frame):
    def __init__(self, parent):
        super().__init__(parent)
        ...
        ...
    async def _run(self, host, command, user, password):
        try:
            async with asyncssh.connect(host, username=user, password=password,
                                        client_keys=None) as conn:
                self._proc = await conn.create_process(command,
                                                       term_type='dumb')
                while not self._proc.stdout.at_eof():
                    self._output(await self._proc.stdout.read(1024))

                self._output('\n[Disconnected]\n')
        except (asyncssh.Error, OSError) as exc:
            self._output('[%s]\n' % str(exc))
        finally:
            self._proc = None

class App(tkinter.Frame):
    def __init__(self, parent):
        super().__init__(parent)
        ...
        ...

asyncio.get_event_loop().run_until_complete(_event_loop(App(tkinter.Tk())))


回答1:


import asyncio
import sys

from gi.repository import Gtk, GLib

@asyncio.coroutine
def start(app):
    yield from asyncio.sleep(0)
    app.register()
    app.activate()


def glib_update(main_context, loop):
    while main_context.pending():
        main_context.iteration(False)
    loop.call_later(.01, glib_update, main_context, loop)


if sys.platform == "win32":
    from asyncio.windows_events import ProactorEventLoop
    loop = ProactorEventLoop()
    asyncio.set_event_loop(loop)
else:
    loop = asyncio.SelectorEventLoop()
    asyncio.set_event_loop(loop)

# This is just a fake gtk appliaction here, you should create your own see
# http://python-gtk-3-tutorial.readthedocs.io/en/latest/application.html
my_gtk_app = Gtk.Application()

try:
    main_context = GLib.MainContext.default()
    asyncio.async(start(my_gtk_app))
    glib_update(main_context, loop)
    loop.run_forever()
finally:
    loop.close()


来源:https://stackoverflow.com/questions/39804102/python-3-4-gtk-async

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!