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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM