def recv(): global users, friends while True: # 消息主循环 data = s.recv(1024) data = data.decode() msg = data.split(':;') if len(msg) == 1: # 是用户列表消息 data = json.loads(data) # 还原为列表对象 print(data) if data["type"] == "online_list": # 在线列表消息 users = data["data"] online_list.delete(0,tkinter.END) # 清空列表框 number = ' 在线用户:'+str(len(users)) online_list.insert(tkinter.END, number) online_list.itemconfig(tkinter.END, fg='green', bg='#f0f0ff') online_list.insert(tkinter.END, '===== 群聊 =====') online_list.insert(tkinter.END, 'Robot') online_list.itemconfig(tkinter.END, fg='green') for i in range(len(users)): online_list.insert(tkinter.END, users[i]) online_list.itemconfig(tkinter.END, fg='green') elif data["type"] == "friend_list": friends = data["data"] friend_list.delete(0, tkinter.END) # 清空好友列表框 number = ' 用户好友:' + str(len(friends)) friend_list.insert(tkinter.END, number) friend_list.itemconfig(tkinter.END, fg='green', bg='#f0f0ff') for i in range(len(friends)): friend_list.insert(tkinter.END, friends[i]) friend_list.itemconfig(tkinter.END, fg='green') 请修改上述代码
时间: 2024-02-04 11:02:13 浏览: 133
以下是修改后的代码,将消息接收和解析的逻辑分离出来,将好友列表和用户列表存储在字典中,方便查找:
```
users_dict = {}
friends_dict = {}
def parse_message(data):
msg = data.split(':;')
if len(msg) == 1: # 是用户列表消息
data = json.loads(data) # 还原为列表对象
if data["type"] == "online_list": # 在线列表消息
online_users = data["data"]
offline_users = [user for user in users_dict.keys() if user not in online_users]
update_user_list(online_users, offline_users)
users_dict.update((user, True) for user in online_users)
users_dict.update((user, False) for user in offline_users)
elif data["type"] == "friend_list": # 好友列表消息
friends = data["data"]
update_friend_list(friends)
friends_dict.clear()
friends_dict.update((friend, True) for friend in friends)
else: # 是聊天消息
# TODO: 处理聊天消息
pass
def update_user_list(online_users, offline_users):
online_list.delete(0, tkinter.END)
number = ' 在线用户:'+str(len(online_users))
online_list.insert(tkinter.END, number)
online_list.itemconfig(tkinter.END, fg='green', bg='#f0f0ff')
online_list.insert(tkinter.END, '===== 群聊 =====')
online_list.insert(tkinter.END, 'Robot')
online_list.itemconfig(tkinter.END, fg='green')
for user in online_users:
online_list.insert(tkinter.END, user)
online_list.itemconfig(tkinter.END, fg='green')
for user in offline_users:
online_list.insert(tkinter.END, user)
online_list.itemconfig(tkinter.END, fg='gray')
def update_friend_list(friends):
friend_list.delete(0, tkinter.END)
number = ' 用户好友:' + str(len(friends))
friend_list.insert(tkinter.END, number)
friend_list.itemconfig(tkinter.END, fg='green', bg='#f0f0ff')
for friend in friends:
if friend in users_dict and users_dict[friend]: # 好友在线
friend_list.insert(tkinter.END, friend)
friend_list.itemconfig(tkinter.END, fg='green')
else: # 好友离线
friend_list.insert(tkinter.END, friend)
friend_list.itemconfig(tkinter.END, fg='gray')
def recv():
global users_dict, friends_dict
while True:
data = s.recv(1024).decode()
parse_message(data)
```
这段代码将在线用户列表和离线用户列表分开处理,对于离线用户,在用户列表中使用灰色字体表示。好友列表也更新为了一个字典形式,方便查找某个好友是否在线。聊天消息的处理部分暂时使用了TODO标记,需要根据具体需求进行实现。
阅读全文