Python 3.4 / GTK / Async

时间:2016-10-01 07:30:32

标签: pygtk gtk3 python-asyncio pyobject

我使用tkinter和async funktion。

现在我将使用gtk3而不是tkinkter。

还有办法运行我的异步功能吗?

我应该如何调整代码

以下是一些代码片段:

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 个答案:

答案 0 :(得分: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()