2016-10-01 140 views
2

我使用tkinter與異步功能。Python 3.4/GTK /異步

現在我將使用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
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()