带有登陆界面的python聊天室

小白学习python时所学

界面使用了tkinter模块,人工智能的地方借鉴了其他人的做法,使用requests请求模块实现

首先是tcp聊天室代码
服务器端:

import socket
import time
import tkinter
import requests
from socket import *
from time import ctime
from tkinter import *
 
 
global Text_Show  # 调用人工智能对话的函数,返回人工智能回答
 
 
def AI_Talk(s):
    print(s)
    response = requests.post("http://www.tuling123.com/openapi/api", data={
        "key": "4105cb6db8c54f5db470b6c0ee42d24b",
        "info": s})
    response = response.json()
    answer = response['text']
    return answer
    # 线程二函数,用来进行对话
 
 
def Sever_Thread(sock, caddr):
    Text_Show.insert('end', "客户端@" + str(caddr[1]) + "已连接!\n")
    while True:
        # 接收数据
        data = str(sock.recv(1024).decode('UTF-8'))
        if data == "quit":
            Text_Show.insert('end', "客户端@" + str(caddr[1]) + "终止了对话\n")
            Text_Show.see(tkinter.END)
            break
        else:
            Text_Show.insert('end', "来自客户端@" + str(caddr[1]) + "的消息为:" + data + '\n')
            Text_Show.see(tkinter.END)
            # 发送数据
        time.sleep(0.2)
        data = AI_Talk(data)  #
        # data = '请输入发送至客户端的数据: 123123' #如果要手动输入的话就要设置好线程sleep时间不然还没有输入,就已经到其他线程了,就会发不出去。
        sock.sendall(bytes(data, 'UTF-8'))
    sock.close()  # 线程一函数,监听端口,一旦有客户端接入,开启线程二
 
 
def Sever_Accept(ss):
    while True:
        sock, caddr = ss.accept()
  caddr))
        Thread2.daemon = True  # 线程守护
        Thread2.start()
 
 
# 服务器初始化
def Sever_Init():
    HOST = ''
    PORT = 4700
    ADDR = (HOST, PORT)
    ss = socket(AF_INET, SOCK_STREAM, 0)
    ss.bind(ADDR)
    ss.listen(20)  # 允许最大监听数
    Thread1 = threading.Thread(target=Sever_Accept, args=(ss,))
    Thread1.daemon = True  # 线程守护
    Thread1.start()
 
    # 主函数
 
 
if __name__ == "__main__":
    root = tkinter.Tk()
    root.title("chat ")
    frame1 = Frame(root)
    frame1.pack()
    IP_Show_Label = Label(frame1, text="默认IP:127.0.0.1\n默认端口为4700")
    IP_Show_Label.pack(side='left')
    frame2 = Frame(root)
    frame2.pack()
    Text_Show = ScrolledText(frame2, width=100, height=30)
    Text_Show.bind("<KeyPress>", lambda e: "break")
    Text_Show.pack(side="bottom", fill='both', expand=True)
    Sever_Init()
    root.mainloop()

服务器打开界面
其中连接的实现使用的是socket模块,聊天实现使用requests模块
客户端:

import socket
import time
import tkinter
from tkinter.scrolledtext import ScrolledText
import threading
import requests
import tkinter
from PIL import ImageTk,Image
global cs, Text_Show, Send_Show
 
 
# 发送按键的函数
def Click_Send():
    sendData = Send_Show.get()  # 获取输入内容
    if sendData == 'quit':
        Text_Show.insert(tkinter.END, "与服务器连接已断开" + "\n")
        Text_Show.see(tkinter.END)
        cs.sendall(bytes(sendData, encoding="utf8"))
        cs.close()
    else:
        Text_Show.insert(tkinter.END, "客户端:" + sendData + "\n")
        Text_Show.see(tkinter.END)
        cs.sendall(bytes(sendData, encoding="utf8"))
    Send_Show.delete(0, END)
 
 
# 线程函数,循环接受客户端消息
def Receive_Data():
    while True:
        accept_data = str(cs.recv(1024), encoding="utf8")
        Text_Show.insert(tkinter.END, "服务器:" + accept_data + "\n")
        Text_Show.see(tkinter.END)
 
 
# 主函数
if __name__ == "__main__":
    # 初始化GUI
    root = tkinter.Tk()
    root.title("chat ")
    canvas = tkinter.Canvas(root, width=800,height=350,bd=0, highlightthickness=0)
    image2 =Image.open(r'C:\Users\Lenovo\Desktop\chat\1.JPG')
    background_image = ImageTk.PhotoImage(image2)
    canvas.create_image(700, 500, image=background_image)
    canvas.pack()

    # 顶部显示部分
    frame1 = Frame(root)
    frame1.pack()
    IP_Show_Label = Label(frame1, text="本程序默认IP:127.0.0.1\n默认端口4700\n")
    IP_Show_Label.pack(side='left')
    # 中部聊天框显示部分
    frame2 = Frame(root)
    frame2.pack()
    Text_Show = ScrolledText(frame2, width=100, height=15)
    Text_Show.bind("<KeyPress>", lambda e: "break")
    Text_Show.pack(side="bottom", fill='both', expand=True)
   
    button_Send = tkinter.Button(frame3, width=10, textvariable=buttontext2, command=Click_Send)
    Send_Show.pack(side="left")
    button_Send.pack(side="left")
    frame3.pack()
 
    # 初始化TCP协议
    HOST = '127.0.0.1'
    PORT = 4700
    BUFSIZ = 1024
    ADDR = (HOST, PORT)
    cs = socket(AF_INET, SOCK_STREAM, 0)
    cs.connect(ADDR)
 
    thread = threading.Thread(target=Receive_Data)
    thread.start()
 
    root.mainloop()

客户端打开界面
登录界面:

import tkinter
import tkinter.messagebox
import os

def login():
    name = entryName.get()
    pwd = entryPwd.get()
    if name =='admin'and pwd =='123456':
        os.system('client.py')
    else :
        tkinter.messagebox.showerror('chat',message='Error')


def cancel():
    varName.set('')
    varPwd.set('')


if __name__  == "__main__":
    root=tkinter.Tk()
    root.title('chat')
    varName=tkinter.StringVar(value='')
    varPwd=tkinter.StringVar(value='')

    labelName=tkinter.Label(root,text='User Name:',justify=tkinter.RIGHT,width=80)
    labelName.place(x=10,y=5,width=80,height=20)

    entryName=tkinter.Entry(root,width=80,textvariable=varName)
    entryName.place(x=100,y=5,width=80,height=20)

    labelPwd=tkinter.Label(root,text='User Pwd',justify=tkinter.RIGHT,width=80)
    labelPwd.place(x=10,y=30,width=80,height=20)

  
    buttonCancel=tkinter.Button(root,text='Cancel',command=cancel)
    buttonCancel.place(x=90,y=70,width=50,height=20)

    root.mainloop()

登陆界面
登录是使用了os模块进行启动客户端

实际使用效果:
在这里插入图片描述

  • 7
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值