2014-10-31 15 views
9

Okey guys pytanie dotyczące asyncio i Gtk +. Jak mogę uruchomić kod poniżej w pętli Gtk.main? Szukałem na przykład, ale nie mogłem znaleźć.Asyncio dzwoni w pętli głównej Gtk

#!/usr/bin/python3.4 

import asyncio 

@asyncio.coroutine 
def client_connected_handler(client_reader, client_writer): 
    print("Connection received!") 
    client_writer.write(b'Hello') 
    while True: 
     data = yield from client_reader.read(8192) 
     if not data: 
      break 
     if 'EXIT' in data.decode(): 
      print("Closing server") 
      break 
     print(data) 
     client_writer.write(data) 
    print('Server is closed') 


loop = asyncio.get_event_loop() 
Server=asyncio.start_server(client_connected_handler, 'localhost', 2222) 
server=loop.run_until_complete(Server) 
loop.run_forever() 

EDIT:

Okey powinienem napisać doświadczeniem z gbulb. Najpierw przeszukałem go za pomocą pip3. Znalazłem go i próbowałem go zainstalować, ale nie udało się (korzystałem z superużytkownika do instalacji) ze względu na złe linki. Następnie pobrałem go ze swojego repozytorium i zainstalowałem. Mam to example Uruchomiłem i otrzymałem kilka błędów dotyczących brakujących argumentów w ich module głównym. Nie wiem, który błąd jest przyczyną, ponieważ piszę to z innego komputera. Aktualizacja będzie jak najszybciej. Byłbym też wdzięczny, gdyby ktokolwiek inny mógł to przetestować.

+0

Aby zaktualizować powyższym 'pip3 zainstalować gbulb' działa poprawnie, a licznik w demo sekcja Przykłady na [Github] (https://github.com/nathan-hoad/gbulb) działa bez żadnych problemów. – jcoppens

Odpowiedz

9

To jest dokładnie to, czego potrzebujesz, złącze między interfejsem pętli głównej asyncio a implementacją pętli głównej GLib. Jednak obecny master gbulb jest uszkodzony dla asyncio, jak dostarczono z Pythonem 3.4. Aby to naprawić, możesz sprawdzić numer this fork zamiast wzorca.

Z tej poprawki w miejscu, to jest trywialne zmodyfikować przykład zarówno przyjmowania połączeń przychodzących i uruchomić GTK:

#!/usr/bin/python3.4 

import asyncio, gbulb 
from gi.repository import Gtk 
asyncio.set_event_loop_policy(gbulb.GtkEventLoopPolicy()) 

@asyncio.coroutine 
def client_connected_handler(client_reader, client_writer): 
    print("Connection received!") 
    client_writer.write(b'Hello') 
    while True: 
     data = yield from client_reader.read(8192) 
     if not data: 
      break 
     if 'EXIT' in data.decode(): 
      print("Closing server") 
      break 
     print(data) 
     client_writer.write(data) 
    print('Server is closed') 


loop = asyncio.get_event_loop() 
Server=asyncio.start_server(client_connected_handler, 'localhost', 2222) 
server=loop.run_until_complete(Server) 

w = Gtk.Window() 
w.add(Gtk.Label('hey!')) 
w.connect('destroy', Gtk.main_quit) 
w.show_all() 

loop.run_forever()