Tkinter 之socket聊天室
一、效果图
二、代码
import json import time from tkinter import messagebox from threading import Thread from socketClient import SocketClient from LoginWindow import LoginWindow from MainWindow import MainWindow from RegisterWindow import RegisterWindow ip = '127.0.0.1' port = 12346 def open_main_window(): global main_window main_window = MainWindow(send_message, close_main_window) t = Thread(target=recv_data) t.setDaemon(True) t.start() main_window.show() def recv_data(): time.sleep(1) client_socket = client.get_client() while True: try: data = client_socket.recv(1024).decode() print('=====recv_data====') data = json.loads(data) print(data) _type = data.get('type') if _type == 'logout': break elif _type == 'online': user_name_list = data.get('data') user_name_list.reverse() print('在线用户:') print(user_name_list) main_window.set_user_list(user_name_list) elif _type == 'message': main_window.set_user_message(data.get('data')) except Exception as e: print(e) break client.disconnect() def close_main_window(): client.send_message('{"type": "logout"}') main_window.window.destroy() def login(): global username username, password = login_window.get_input() if username == '' or password == '': messagebox.showerror(title='提示', message='请输入用户名或密码') return result = client.check_user(username, password) data = json.loads(result) data = data.get('data') if data == 'uerror': messagebox.showerror(title="错误", message="用户名不存在") elif data == 'perror': messagebox.showerror(title="错误", message="密码不正确") elif data == 'ok': login_window.window.destroy() client.get_online_user() open_main_window() def register(): print('register...') global register_window login_window.window.destroy() register_window = RegisterWindow(do_cancel, do_register, close_register_window) register_window.show() def close_register_window(): client.send_message('{"type": "logout"}') register_window.close_register_window() def do_cancel(): register_window.window.destroy() login_window.show() def do_register(): username, password, rpassword = register_window.get_input() if username == '': messagebox.showerror(title='提示', message='请输入用户名') return if password == '': messagebox.showerror(title='提示', message='请输入密码') return if rpassword == '': messagebox.showerror(title='提示', message='请再次输入密码') return if password != rpassword: messagebox.showerror(title='提示', message='两次密码输入不一致') return result = client.register_user(username, password) data = json.loads(result) data = data.get('data') print(data) if data == 'exists': messagebox.showerror(title='错误', message='用户已经被注册') return elif data == 'ok': messagebox.showinfo(title='提示', message='注册用户成功') do_cancel() def close_login_window(): print('close_login_window...') client.send_message('{"type": "logout"}') login_window.close_login_window() def send_message(): print('send_message...') message = main_window.get_message() if len(message) == 0: messagebox.showerror(title='提示', message='请输入消息') return msg = '{"type":"message", "username": "%s", "message": "%s"}' % (username, message) client.send_message(msg) def main(): global client, login_window client = SocketClient(ip, port) login_window = LoginWindow(login, register, close_login_window) login_window.show() if __name__ == '__main__': main()
三、获取源码
QQ:2575404985