我正在使用PySide和这个IRC库(https://bitbucket.org/jaraco/irc)在Python中创建一个GUI IRC客户端。 PySide有一个主循环来处理GUI事件。 IRC库还有一个循环来处理IRC事件。两个循环在被调用后阻塞。我该怎么办?它只是在不同的线程中运行它们吗?
答案 0 :(得分:1)
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_()
。
答案 1 :(得分:0)
来自该客户端的IRCServer
是来自TCPServer
的派生类,它是提供启动循环的serve_forever
方法的派生类。还有一种替代方法handle_request
,可以处理单个请求(如果有的话)。
serve_forever
基本上就是在一个循环中(它实际上调用了一个较低级别的方法)。您可以设置QTimer
来轮询IRCserver,例如。每0.5秒(serve_forever
的默认值)。为服务器设置超时0,以避免结束锁定并完成。