????????我在网上迅速学习了联机(只限于同一个网络),然后自己操作,用tkinter创作用户界面,搞了一个联机聊天室。
?
?两台电脑之间真的可以联机聊天(亲测成功)
还可以对字体、背景等进行设置!
客户端代码
import _thread import socket import sys import time from tkinter import * from tkinter import messagebox from tkinter.ttk import *
def go(): ? ? global name ? ? if entry.get()!='': ? ? ? ? name=entry.get() ? ? ? ? r1.destroy() ? ? else: ? ? ? ? messagebox.showerror('Error','昵称不得为空')
r1=Tk() r1.title('聊天室') r1.geometry('300x200+300+300')
label=Label(r1,text='进入聊天室之前,先起一个昵称') label.pack(anchor='c',pady=20)
entry=Entry(r1,width=18) entry.pack(anchor='c',pady=20)
button=Button(r1,text='进入聊天室',command=go) button.pack(anchor='c',pady=20)
r1.mainloop()
# 为线程定义一个函数 #def th1(): def th2(): ? ? global root ? ? global s ? ? global text1
? ? s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)?
? ? host = 'A6-PC'
? ? port = 12358
? ? s.connect((host, port))? ? ? while True: ? ? ? ? global msg ? ? ? ? global text1 ? ? ? ? msg=s.recv(20480) ? ? ? ? text1['state']=NORMAL ? ? ? ? #print(msg.decode('utf-8')) ? ? ? ? text1.insert(END,msg.decode('utf-8')) ? ? ? ? text1['state']=DISABLED
global root global s global text1 global text2 global r global sp global cb global v3 global v4 global size_ global family_ global fg_ global bg_ global name
root=Tk() root.title('聊天室')
def send(): ? ? global name ? ? if len(text2.get('1.0',END))==1 or text2.get('1.0',END).isspace() == True: ? ? ? ? messagebox.showerror('Error','输入不得为空') ? ? else: ? ? ? ? msg=time.ctime()+' '+name+': '+text2.get('1.0',END) ? ? ? ? s.send(msg.encode('utf-8')) ? ? text2.delete('1.0',END) def configure(): ? ? global r ? ? global sp ? ? global cb ? ? global v3 ? ? global v4 ? ? global size_ ? ? global family_ ? ? global fg_ ? ? global bg_ ? ? r=Tk() ? ? r.title('设置') ? ? r.resizable(0,0) ? ? v1=IntVar(r) ? ? v1.set(size_) ? ? v2=StringVar(r) ? ? v3=StringVar(r) ? ? v3.set(fg_) ? ? v4=StringVar(r) ? ? v4.set(bg_) ? ? l1=Label(r,text='文本大小') ? ? l1.grid(row=0,column=0,padx=10,pady=10) ? ? sp=Spinbox(r,from_=12,to=25,textvariable=v1,width=10) ? ? sp.grid(row=0,column=1,padx=10,pady=10) ? ? l2=Label(r,text='文本字体') ? ? l2.grid(row=0,column=2,padx=10,pady=10) ? ? value=('宋体','黑体','楷体','手书体','华文新魏','华文行楷','华文彩云','Edwardian Script ITC','Forte') ? ? cb=Combobox(r,textvariable=v2.get,value=value,width=10) ? ? cb.grid(row=0,column=3,padx=10,pady=10) ? ? cb.set(family_) ? ? l3=Label(r,text='文本颜色') ? ? l3.grid(row=1,column=0) ? ? op1=OptionMenu(r,v3,'','Black','DimGrey','Crimson','DarkOrange','GoldenRod','Green','LightSeaGreen','Indigo') ? ? op1.grid(row=1,column=1) ? ? l4=Label(r,text='背景颜色') ? ? l4.grid(row=1,column=2) ? ? op2=OptionMenu(r,v4,'','White','Gainsboro','LightPink','Bisque','Beige','LightGreen','LightSkyBlue','MediumPurple') ? ? op2.grid(row=1,column=3) ? ? b1=Button(r,text='完成',command=ok) ? ? b1.grid(row=2,column=0,pady=5,padx=5,columnspan=2) ? ? b2=Button(r,text='重置',command=reset) ? ? b2.grid(row=2,column=2,pady=5,padx=5,columnspan=2) def ok(): ? ? global r ? ? global sp ? ? global cb ? ? global v3 ? ? global v4 ? ? global size_ ? ? global family_ ? ? global fg_ ? ? global bg_ ? ? size_=sp.get() ? ? family_=cb.get() ? ? fg_=v3.get() ? ? bg_=v4.get() ? ? text1['font']=(family_,size_,'normal') ? ? text2['font']=(family_,size_,'normal') ? ? text1['fg']=fg_ ? ? text1['bg']=bg_ ? ? text2['fg']=fg_ ? ? text2['bg']=bg_ ? ? r.destroy() def reset(): ? ? global r ? ? global sp ? ? global cb ? ? global v3 ? ? global v4 ? ? global size_ ? ? global family_ ? ? global fg_ ? ? global bg_ ? ? size_=15 ? ? family_='宋体' ? ? fg_='Black' ? ? bg_='White' ? ? text1['font']=(family_,size_,'normal') ? ? text2['font']=(family_,size_,'normal') ? ? text1['fg']=fg_ ? ? text1['bg']=bg_ ? ? text2['fg']=fg_ ? ? text2['bg']=bg_ ? ? r.destroy() size_=15 family_='宋体' fg_='Black' bg_='White'
scrollbar=Scrollbar(root)
text1=Text(root,width=50,font=('宋体',15,'normal'),yscrollcommand=scrollbar.set,state=DISABLED,fg=fg_,bg=bg_) text1.pack(side=LEFT,fill=BOTH,expand=1) scrollbar.pack(side=LEFT,fill=Y) scrollbar.config(command=text1.yview)
text2=Text(root,width=20,height=5,font=('宋体',15,'normal'),fg=fg_,bg=bg_) text2.pack(side=TOP,padx=10,pady=10)
button=Button(root,text='发送',width=8,command=send) button.pack(side=TOP,padx=10,pady=10)
menubar=Menu(root) menu1=Menu(menubar,tearoff=0) menubar.add_cascade(label='设置',menu=menu1) menu1.add_command(label='设置选项',command=configure) root.config(menu=menubar) _thread.start_new_thread( th2, () ) root.mainloop()
# 创建两个线程 try: ? ?_thread.start_new_thread( th2, () ) except: ? ?print ("Error: 无法启动线程")
while 1: ? ?pass ?
希望大佬们批评指正!毕竟我还是初中生 (真)
|