2024-06-01 01:56:16 发布
网友
我正在使用PySide和这个IRC库(https://bitbucket.org/jaraco/irc)在Python中制作GUI IRC客户机。PySide有一个主循环来处理GUI事件。IRC库还有一个处理IRC事件的循环。调用后两个循环都会阻塞。我该怎么办?只是在不同的线程中运行它们吗?在
来自该客户机的IRCServer是TCPServer的派生类,它提供启动循环的serve_forever方法。还有一个替代方法,handle_request,它将处理单个请求(如果有)。在
IRCServer
TCPServer
serve_forever
handle_request
serve_forever基本上就是这样,在一个循环中(它实际上调用了一个较低级别的方法)。您可以设置QTimer来轮询IRCserver,例如每隔0.5秒(默认值为serve_forever)。同时为服务器设置一个0的超时值,以避免最终被锁定。在
QTimer
IRC客户机类通过on_connect、on_disconnect和{}参数支持外部主循环集成。在PySide中,您可以使用这些来创建QSocketNotifier,销毁它,并分别设置QTimer:
IRC
on_connect
on_disconnect
QSocketNotifier
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_()。在
PySideIRCClient
QtGui.QApplication.exec_()
来自该客户机的
IRCServer
是TCPServer
的派生类,它提供启动循环的serve_forever
方法。还有一个替代方法,handle_request
,它将处理单个请求(如果有)。在serve_forever
基本上就是这样,在一个循环中(它实际上调用了一个较低级别的方法)。您可以设置QTimer
来轮询IRCserver,例如每隔0.5秒(默认值为serve_forever
)。同时为服务器设置一个0的超时值,以避免最终被锁定。在IRC
客户机类通过on_connect
、on_disconnect
和{QSocketNotifier
,销毁它,并分别设置QTimer
:然后,
PySideIRCClient
与PySide Qt事件循环集成,因此您可以只使用QtGui.QApplication.exec_()
。在相关问题 更多 >
编程相关推荐