2014-10-31 19 views
9

Okey Jungs Frage bezüglich asyncio und Gtk +. Wie kann ich Code unten in Gtk.main Schleife ausführen? Ich habe zum Beispiel gesucht, konnte aber keine finden.Asyncio Anrufe läuft in Gtk Hauptschleife

#!/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 sollte ich mein Fachwissen mit gbulb schreiben. Zuerst habe ich es mit pip3 gesucht. Ich habe es gefunden und versucht, es zu installieren, aber es fehlgeschlagen (ich benutzte Super-User für die Installation) aufgrund schlechter Links. Als nächstes habe ich es aus ihrem Repository heruntergeladen und installiert. Ich habe diese example Ich führe es und habe ein paar Fehler für fehlende Argumente in ihrem Kern-Modul.Ich weiß nicht wirklich, welcher Fehler ist es Ursache Ich schreibe dies von verschiedenen PC I ' ll Update ist so schnell wie möglich. Auch ich wäre dankbar, wenn jemand anderes es testen könnte.

+0

die oben zu aktualisieren, 'PIP3 installieren gbulb' funktioniert gut, und der Zähler Demo in Der Abschnitt Beispiele auf [Github] (https://github.com/nathan-hoad/gbulb) läuft ohne Probleme. – jcoppens

Antwort

9

Die gbulb library ist genau das, was Sie brauchen, ein Verbindungsstück zwischen der asyncio Hauptschleife Schnittstelle und der GLib Hauptschleife Implementierung. Der aktuelle Master von gbulb ist jedoch für asyncio wie mit Python 3.4 ausgeliefert gebrochen. Um dies zu beheben, können Sie this fork anstelle des Masters auschecken.

Mit dieser Fix an Ort und Stelle, ist es trivial Ihr Beispiel zu ändern, sowohl eingehende Verbindungen zu akzeptieren und führt 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()