1.一个有关于socket客户端和服务端的简单程序
2.使用wxpython做GUI
from socket import *
import time
import wx
import threading
import struct
class S(wx.Frame):
def init(self,parent,title):
wx.Frame.__init__(self,parent,wx.ID_ANY,title = title, size = (700,500))
#创建画板
self.panel = wx.Panel(self,wx.ID_ANY)
self.panel.SetBackgroundColour("White")
#创建按钮
self.button = wx.Button(self.panel,wx.ID_ANY,'发送', pos = (540,400),size = (50,25))
self.Bind(wx.EVT_BUTTON,self.OnClick,self.button)
#创建静态文本
self.static = wx.StaticText(self.panel,wx.ID_ANY,'输入消息',pos = (10,380))
self.static.SetBackgroundColour('White')
#创建记录区域
self.log = wx.TextCtrl(self.panel, wx.ID_ANY,"",size = (620,310),pos = (10,60), style = wx.TE_MULTILINE|wx.TE_READONLY)
#创建输入区域
self.inputmsg = wx.TextCtrl(self.panel, wx.ID_ANY,size = (520,25),style = wx.TE_PROCESS_ENTER,pos = (10,400))
self.Bind(wx.EVT_TEXT_ENTER, self.OnClick, self.inputmsg)
#连接
self.addr = ('127.0.0.1',5354)
self.ss = socket(AF_INET,SOCK_STREAM)
self.ss.bind(self.addr)
self.ss.listen(5)
self.data = (u"等待客户连接……\n")
self.log.AppendText(self.data)
#显示
self.Show(True)
#text
self.data = ''
self.temp = ''
self.msg = ''
self.flag = True
self.sendmsg = ''
def OnClick(self,event):
self.msg = self.inputmsg.GetValue()
self.sendmsg = (u"回复:%s\n" % (self.msg))
self.log.AppendText(self.sendmsg)
self.inputmsg.Clear()
self.flag = True
def run(self):
cs,caddr = self.ss.accept()
while True:
self.data = cs.recv(1024)
if not self.data:
break
self.temp = str(self.data,'utf-8')
self.log.AppendText(self.temp)
if self.flag:
cs.send(bytes(u"%s\n"%(self.sendmsg),'utf-8'))
self.flag = False
self.cs.close()
self.ss.close()
class C(wx.Frame):
def init(self,parent,title):
wx.Frame.__init__(self,parent,wx.ID_ANY,title = title, size = (700,500))
#创建画板
self.panel = wx.Panel(self,wx.ID_ANY)
self.panel.SetBackgroundColour("White")
#创建按钮
self.button = wx.Button(self.panel,wx.ID_ANY,'发送', pos = (540,400),size = (50,25))
self.Bind(wx.EVT_BUTTON,self.OnClick,self.button)
#创建静态文本
self.static = wx.StaticText(self.panel,wx.ID_ANY,'输入消息',pos = (10,380))
self.static.SetBackgroundColour('White')
#创建记录区域
self.log = wx.TextCtrl(self.panel, wx.ID_ANY,'',size = (620,310),pos = (10,60), style = wx.TE_RICH|wx.TE_MULTILINE|wx.TE_READONLY)
#创建输入区域
self.inputmsg = wx.TextCtrl(self.panel, wx.ID_ANY,'',size = (520,25),style = wx.TE_PROCESS_ENTER,pos = (10,400))
self.Bind(wx.EVT_TEXT_ENTER, self.OnClick, self.inputmsg)
#连接
self.addr = ('127.0.0.1',5354)
self.client = socket(AF_INET,SOCK_STREAM)
try:
# Connect to server and send data
self.client.connect(self.addr)
self.log.AppendText(u"连接服务器成功...\n")
except Exception:
self.log.AppendText(u"连接服务器失败...\n")
self.client.close()
#显示
self.Show(True)
#text
self.data = ''
self.temp = ''
self.msg = ''
self.flag = True
self.sendmsg = ''
def OnClick(self,event):
self.msg = self.inputmsg.GetValue()
self.sendmsg = (u"发送:%s\n" % (self.msg))
self.client.send(bytes(self.msg,'utf-8'))
self.log.AppendText(self.sendmsg)
self.inputmsg.Clear()
def run(self):
while True:
self.data = self.client.recv(1024)
if not self.data:
break
self.temp = str(self.data,'utf-8')
self.log.AppendText(self.temp)
self.client.close()
app = wx.App(False)
frame1 = S(parent = None, title = '服务端')
frame2 = C(parent = None, title = '客户端')
app.MainLoop()
threads = []
t1 = threading.Thread(target = frame1.run)
t2 = threading.Thread(target = frame2.run)
threads.append(t1)
threads.append(t2)
for t in threads:
t.start()
在接收部分出现问题,接收到的代码,应如何插入到只读文本中,使用AppendText()出现RuntimeError: wrapped C/C++ object of type TextCtrl has been deleted错误
应该怎么解决
试着在self.log1.AppendText()前插入了self.log1.AppendText(u"你好\n")这次在新添语句的地方报错了
大概明白错哪儿了,想请教一下解决办法