3

我正在使用 PySide 和这个 IRC 库(https://bitbucket.org/jaraco/irc)在 Python 中制作一个 GUI IRC 客户端。PySide 有一个处理 GUI 事件的主循环。IRC 库也有一个循环来处理 IRC 事件。两个循环在调用后都会阻塞。我该怎么办?它只是在不同的线程中运行它们吗?

4

2 回答 2

1

客户端类通过,和参数IRC支持外部主循环集成。在 PySide 中,您将使用这些来创建 a 、销毁它并分别设置 a :on_connecton_disconnecton_scheduleQSocketNotifierQTimer

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_().

于 2013-04-09T18:11:45.830 回答
0

from that client 是 from的IRCServer派生类TCPServer,它提供serve_forever启动循环的方法。有一种替代方法,handle_request它将处理单个请求(如果有的话)。

serve_forever基本上这样做,在一个循环中(它实际上调用了一个较低级别的方法)。您可以设置QTimer轮询 IRCserver,例如。每 0.5 秒(默认为serve_forever)。还将服务器的超时设置为 0,以避免最终锁定并完成。

于 2013-04-09T17:28:35.260 回答