实例介绍
【实例简介】基于python socket和tkinter界面库实现的网络聊天室程序,实现登录、注册、在线成员显示、聊天等功能
【实例截图】
服务端:
客户端:
【核心代码】
from LoginPanel import LoginPanel from MainPanel import MainPanel from RegisterPanel import RegisterPanel from Client import ChatClient import MD5 from tkinter import messagebox from threading import Thread import time def send_message(): print("send message:") content = main_frame.get_send_text() if content == "" or content == "\n": print("空消息,拒绝发送") return print(content) # 清空输入框 main_frame.clear_send_text() client.send_message(content) def close_sk(): print("尝试断开socket连接") client.sk.close() def close_main_window(): close_sk() main_frame.main_frame.destroy() def close_login_window(): close_sk() login_frame.login_frame.destroy() # 关闭注册界面并打开登陆界面 def close_reg_window(): reg_frame.close() global login_frame login_frame = LoginPanel(login, register, close_login_window) login_frame.show() # 关闭登陆界面前往主界面 def goto_main_frame(user): login_frame.close() global main_frame main_frame = MainPanel(user, send_message, close_main_window) # 新开一个线程专门负责接收并处理数据 Thread(target=recv_data).start() main_frame.show() def login(): print("点击登录按钮") user, key = login_frame.get_input() # 密码传md5 key = MD5.gen_md5(key) if user == "" or key == "": messagebox.showwarning(title="提示", message="用户名或者密码为空") return print("user: " user ", key: " key) if client.check_user(user, key): # 验证成功 goto_main_frame(user) else: # 验证失败 messagebox.showerror(title="错误", message="用户名或者密码错误") # 登陆界面前往注册界面 def register(): print("点击注册按钮") login_frame.close() global reg_frame reg_frame = RegisterPanel(close_reg_window, register_submit, close_reg_window) reg_frame.show() # 提交注册表单 def register_submit(): print("开始注册") user, key, confirm = reg_frame.get_input() if user == "" or key == "" or confirm == "": messagebox.showwarning("错误", "请完成注册表单") return if not key == confirm: messagebox.showwarning("错误", "两次密码输入不一致") return # 发送注册请求 result = client.register_user(user, MD5.gen_md5(key)) if result == "0": # 注册成功,跳往登陆界面 messagebox.showinfo("成功", "注册成功") close_reg_window() elif result == "1": # 用户名重复 messagebox.showerror("错误", "该用户名已被注册") elif result == "2": # 未知错误 messagebox.showerror("错误", "发生未知错误") # 处理消息接收的线程方法 def recv_data(): # 暂停几秒,等主界面渲染完毕 time.sleep(1) while True: try: # 首先获取数据类型 _type = client.recv_all_string() print("recv type: " _type) if _type == "#!onlinelist#!": print("获取在线列表数据") online_list = list() for n in range(client.recv_number()): online_list.append(client.recv_all_string()) main_frame.refresh_friends(online_list) print(online_list) elif _type == "#!message#!": print("获取新消息") user = client.recv_all_string() print("user: " user) content = client.recv_all_string() print("message: " content) main_frame.recv_message(user, content) except Exception as e: print("接受服务器消息出错,消息接受子线程结束。" str(e)) break def start(): global client client = ChatClient() global login_frame login_frame = LoginPanel(login, register, close_login_window) login_frame.show() if __name__ == "__main__": start()
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论