实例介绍
【实例简介】基于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小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论