Python 3.4/GTK/异步 [英] Python 3.4 / GTK / Async

查看:168
本文介绍了Python 3.4/GTK/异步的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我将tkinter与异步功能一起使用.

I use tkinter with a async funktion.

现在,我将使用gtk3代替tkinkter.

Now I will use gtk3 in stead of tkinkter.

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

Is there also a way to run my async function?

我应该如何修改代码

以下是一些代码片段:

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())))

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

推荐答案

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()

这篇关于Python 3.4/GTK/异步的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆