这次的更新修复了以下问题:
1、不能在两个电脑之间通信(再新增了服务器IP登录选项(如localhost和127.0.0.1))
2、邮件不清晰(加上了分隔线)
代码如下:
import tkinter
from tkinter.font import Font
from tkinter.ttk import *
from socket import socket,AF_INET,SOCK_DGRAM
from socketserver import BaseRequestHandler,TCPServer
from tkinter.scrolledtext import *
from threading import Thread
def listen():
server=TCPServer((ip,output),Chat)
server.serve_forever()
def login():
global logintext,yesbt,nameen,name,root,outputen,output,outputtext,ip,ipen
name=nameen.get()
logintext.config(text=f"Hello,{name}")
sendbt=tkinter.Button(root,text="send",command=Mailbox)
nameen.pack_forget()
outputen.pack_forget()
yesbt.pack_forget()
outputtext.pack_forget()
ipen.pack_forget()
iptext.pack_forget()
guibt=tkinter.Button(root,text="GUI",command=gui)
sendbt.pack()
guibt.pack()
output=int(outputen.get())
ip=ipen.get()
Thread(target=listen).start()
class Chat(BaseRequestHandler):
def handle(self):
global mail
msg,sock=self.request
mail.append(msg)
class Mailbox():
def __init__(self):
global screen,mailtext,toen,ipen2
screen=tkinter.Toplevel()
screen.geometry("400x450")
fromtext=tkinter.Label(screen,text=f"From:{name}\noutput:{output}\nip:")
totext=tkinter.Label(screen,text="To output:")
toen=tkinter.Entry(screen)
ipen2=tkinter.Entry(screen)
mailtext=tkinter.Text(screen)
yesbt2=tkinter.Button(screen,text="OK",command=self.send)
fromtext.pack()
ipen2.pack()
totext.pack()
toen.pack()
mailtext.pack()
yesbt2.pack()
def send(self):
server2=socket(AF_INET,SOCK_DGRAM)
text=f"from:{name}\noutput:{output}\nip:{ip}\n****************************\n"+mailtext.get("1.0",tkinter.END)+"------------------------------\n"
server2.sendto(text.encode(),("localhost",int(toen.get())))
screen.destroy()
def gui():
global mail,guitext
guiw=tkinter.Toplevel()
guitext=ScrolledText(guiw,undo=True)
guibt2=tkinter.Button(guiw,text="Refresh",command=refresh_gui)
refresh_gui()
guibt2.pack()
def refresh_gui():
for m in mail:
guitext.insert(tkinter.END,m)
guitext.pack()
if __name__ == "__main__":
mail=[]
root=tkinter.Tk()
root.title("LetChat")
root.geometry("400x200")
titletext=tkinter.Label(root,text="Let Chat")
titletext.config(font=Font(size=30))
logintext=tkinter.Label(root,text="login")
outputtext=tkinter.Label(root,text="output(8000<=output<=25000)")
iptext=tkinter.Label(root,text="IP:")
ipen=tkinter.Entry(root)
nameen=tkinter.Entry(root)
yesbt=tkinter.Button(root,text="yes",command=login)
outputen=tkinter.Entry(root)
titletext.pack()
logintext.pack()
nameen.pack()
outputtext.pack()
outputen.pack()
iptext.pack()
ipen.pack()
yesbt.pack()
灵感如下:
Python两台电脑实现TCP通信_python tcp-CSDN博客
造福一下没登录的同志!!!awa
import tkinter
from tkinter.font import Font
from tkinter.ttk import *
from socket import socket,AF_INET,SOCK_DGRAM
from socketserver import BaseRequestHandler,TCPServer
from tkinter.scrolledtext import *
from threading import Thread
def listen():
server=TCPServer((ip,output),Chat)
server.serve_forever()
def login():
global logintext,yesbt,nameen,name,root,outputen,output,outputtext,ip,ipen
name=nameen.get()
logintext.config(text=f"Hello,{name}")
sendbt=tkinter.Button(root,text="send",command=Mailbox)
nameen.pack_forget()
outputen.pack_forget()
yesbt.pack_forget()
outputtext.pack_forget()
ipen.pack_forget()
iptext.pack_forget()
guibt=tkinter.Button(root,text="GUI",command=gui)
sendbt.pack()
guibt.pack()
output=int(outputen.get())
ip=ipen.get()
Thread(target=listen).start()
class Chat(BaseRequestHandler):
def handle(self):
global mail
msg,sock=self.request
mail.append(msg)
class Mailbox():
def __init__(self):
global screen,mailtext,toen,ipen2
screen=tkinter.Toplevel()
screen.geometry("400x450")
fromtext=tkinter.Label(screen,text=f"From:{name}\noutput:{output}\nip:")
totext=tkinter.Label(screen,text="To output:")
toen=tkinter.Entry(screen)
ipen2=tkinter.Entry(screen)
mailtext=tkinter.Text(screen)
yesbt2=tkinter.Button(screen,text="OK",command=self.send)
fromtext.pack()
ipen2.pack()
totext.pack()
toen.pack()
mailtext.pack()
yesbt2.pack()
def send(self):
server2=socket(AF_INET,SOCK_DGRAM)
text=f"from:{name}\noutput:{output}\nip:{ip}\n****************************\n"+mailtext.get("1.0",tkinter.END)+"------------------------------\n"
server2.sendto(text.encode(),("localhost",int(toen.get())))
screen.destroy()
def gui():
global mail,guitext
guiw=tkinter.Toplevel()
guitext=ScrolledText(guiw,undo=True)
guibt2=tkinter.Button(guiw,text="Refresh",command=refresh_gui)
refresh_gui()
guibt2.pack()
def refresh_gui():
for m in mail:
guitext.insert(tkinter.END,m)
guitext.pack()
if __name__ == "__main__":
mail=[]
root=tkinter.Tk()
root.title("LetChat")
root.geometry("400x200")
titletext=tkinter.Label(root,text="Let Chat")
titletext.config(font=Font(size=30))
logintext=tkinter.Label(root,text="login")
outputtext=tkinter.Label(root,text="output(8000<=output<=25000)")
iptext=tkinter.Label(root,text="IP:")
ipen=tkinter.Entry(root)
nameen=tkinter.Entry(root)
yesbt=tkinter.Button(root,text="yes",command=login)
outputen=tkinter.Entry(root)
titletext.pack()
logintext.pack()
nameen.pack()
outputtext.pack()
outputen.pack()
iptext.pack()
ipen.pack()
yesbt.pack()