如何将套接字添加到 listWidget

Posted

技术标签:

【中文标题】如何将套接字添加到 listWidget【英文标题】:How to add socket into listWidget 【发布时间】:2018-05-23 14:35:23 【问题描述】:

我需要帮助将 python 的套接字对象添加到 PyQt5 listWidget。 首先,我在线程服务器中做这件事

client, addr = self.s.accept()
self.clients.append(client)

然后在QTclass 我正在尝试做这些事情

class win(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.server = Server()
        self.timer = QTimer()
        self.timer.timeout.connect(self.update)

    def clUpdate(self):

        self.ui.ListWidget.addItems(self.server.clients)

但是当客户端连接到服务器时,我遇到了这个异常

TypeError: index 0 has type 'socket' but 'str' is expected

那么?我想稍后使用它,例如,从 listWidget 向特定客户端发送消息

【问题讨论】:

使用self.ui.ListWidget.addItems(self.server.clients[:])self.clients.append(str(client))。 QListWidget 仅用于显示字符串 但是如何将字符串转换回套接字对象?因为我需要将它与我的函数一起使用 你不能,但你可以将字符串和套接字存储在字典中:d= string_or_id_of_socket: socket, .... 然后s=d[string_or_id_of_socket] 我已经考虑过了,但在我看来可能有更简单的方法来做这些事情。 你会发现等价物,也许与角色一起工作,但毕竟是一样的。小部件仅用于显示而不用于管理,您希望将业务逻辑与 GUI 混合,这并不好。再见 【参考方案1】:

我已经尝试过 dicts,现在可以正常工作了

服务器

client, addr = self.s.accept()
self.clients[str(client)] = client

QT

class win(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.server = Server()
        self.timer = QTimer()
        self.timer.timeout.connect(self.update)
    def update(self):      
        itemsTextList = [str(self.ui.listWidget.item(i).text())for i in range(self.ui.listWidget.count())] 
        for key in self.server.clients:
            if key not in itemsTextList:
                self.ui.listWidget.addItem(key)

【讨论】:

是的,但是当客户端的套接字断开连接时从列表中删除它比使用字典做同样的事情要容易得多。这就是为什么我问是否有办法用列表做同样的事情

以上是关于如何将套接字添加到 listWidget的主要内容,如果未能解决你的问题,请参考以下文章

golang 将套接字附加到标准输入/标准输出

Qt的listWidget如何添加右键菜单

RMI 如何添加库(并授予它们套接字权限)

如何将 Python 控制台添加到 C/C++ 程序

如何将数据从 Python 异步套接字服务器发送到子进程?

如何将数据发送到特定的套接字