如何将套接字添加到 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的主要内容,如果未能解决你的问题,请参考以下文章