我使用PySide和這個IRC庫(https://bitbucket.org/jaraco/irc)在Python中製作GUI IRC客戶端。 PySide有一個處理GUI事件的主循環。 IRC庫也有一個循環來處理IRC事件。兩個循環在被調用後阻塞。我該怎麼辦?它只是在不同的線程中運行它們嗎?如何有兩個事件循環?
回答
的IRC
客戶端類支持通過on_connect
,on_disconnect
和on_schedule
參數外部主循環集成。在PySide你可以使用這些來創建一個QSocketNotifier
,摧毀它,並設置分別QTimer
:
class PySideIRCClient(IRC):
def __init__(self):
self.socket_notifiers = {}
return IRC(self.on_connect, self.on_disconnect, self.on_schedule)
def on_connect(self, socket):
notifier = QtCore.QSocketNotifier(socket, QtCore.QSocketNotifier.Read)
notifier.activated.connect(self.socket_activated)
self.socket_notifiers[socket] = notifier
def socket_activated(self, socket):
self.process_data([socket])
def on_disconnect(self, socket):
self.socket_notifiers[socket].setEnabled(False)
del self.socket_notifiers[socket]
def on_schedule(self, seconds):
QtCore.QTimer.singleShot(seconds * 1000, self.process_timeout)
的PySideIRCClient
然後用PySide Qt的事件循環集成,所以你可以只使用QtGui.QApplication.exec_()
。
如果我的主應用程序是從'QtGui.QApplication'派生的,那麼我怎樣才能將'PySideIRCClient'與我的應用程序整合呢? – Jellyflower 2013-04-09 19:45:42
@Jellyflower就像通常一樣使用'myApp.exec _()'; 'QtCore.QSocketNotifier'集成了幕後的Qt主循環。 – ecatmur 2013-04-10 07:49:45
來自該客戶端的IRCServer
是來自TCPServer
的衍生類,它是提供啓動循環的serve_forever
方法的衍生類。還有一種替代方法,即handle_request
,它可以處理單個請求(如果有的話)。
serve_forever
基本上這樣做,在一個循環(它實際上調用較低級別的方法)。您可以設置QTimer
來輪詢IRCserver,例如。每0.5秒(默認值爲serve_forever
)。設置服務器的超時時間爲0,以避免結束鎖定並完成。
- 1. SDL:兩個事件循環?
- 2. 如何兩個for循環
- 3. 雖然while循環內循環,如何兩個條件工作?
- 4. while循環有兩個條件
- 5. 兩個條件while循環
- 6. 如何實現具有兩個循環的條件
- 7. 如何創建有兩個可選條件的if-else循環
- 8. 兩個同步事件創建一個無限循環
- 9. DOMNodeInserted事件循環
- 10. 循環外事件
- 11. Undelegate事件循環
- 12. jQuery循環事件
- 13. 事件循環性
- 14. 如何用QRunnable實現事件循環?
- 15. 如何在循環中綁定事件?
- 16. 如何創建高級循環事件
- 17. Node.js事件循環如何工作?
- 18. For循環只有兩件事情包括C++
- 19. 如何結合兩個for循環
- 20. 如何從兩個for循環在PHP
- 21. 如何同時運行兩個循環
- 22. 如何用smarty循環兩個數組?
- 23. 如何退出兩個嵌套循環
- 24. 如何使用DispatchGroup與兩個循環
- 25. 如何同時運行兩個循環?
- 26. 兩個循環 - 如何停止拼接
- 27. 如何同時循環兩個列表?
- 28. 如何分解兩個循環
- 29. 如何一次循環兩個字典?
- 30. 如何將兩個(for循環)轉換爲(while循環)?
是的,你必須在不同的線程中運行它們。 – 2013-04-09 16:58:40
您的一個或兩個事件循環API可能有一個可供選擇的接口,您可以使用它來顯式輪詢事件。然後,您可以根據需要讓一個循環輪詢其他事件。您可能需要在計時器上完成此操作,因此一個庫的長時間無事件延伸不會爲另一個庫增加太多延遲。我不太瞭解PySide或者你的IRC庫以提供任何細節,但是值得檢查。 – Blckknght 2013-04-09 17:13:22