2014-10-31 57 views
9

Okey傢伙關於asyncio和Gtk +的問題。 如何在Gtk.main循環中運行以下代碼?我搜索例如,但找不到任何。Asyncio調用在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() 

編輯:

歐凱我應該寫我的gbulb的experiance。 首先我使用pip3搜索它。我發現它,並試圖安裝它,但它失敗(我使用超級用戶進行安裝),因爲不好的鏈接。 接下來,我從他們的存儲庫下載並安裝它。我得到這個example我運行它,並在其核心模塊中缺少參數時出現一些錯誤。我不知道是哪個錯誤導致Iam從不同的PC寫入這個錯誤,將盡快更新。如果有其他人可以測試它,我將不勝感激。

+0

要更新上面,'PIP3安裝gbulb'工作正常,並在櫃檯演示[Github](https://github.com/nathan-hoad/gbulb)上的Examples部分順利運行。 – jcoppens 2017-06-04 21:22:55

回答

9

gbulb library正是你所需要的,它是asyncio主循環接口和GLib主循環實現之間的連接器。然而,目前的gbulb的master在Python 3.4附帶的asyncio中被破壞了。要解決這個問題,你可以檢查出this fork而不是主人。

用此修復程序的地方,它是微不足道的修改爲例,既接受傳入的連接和運行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() 
相關問題