griffinxxx 2020-07-30 17:51 采纳率: 0%
浏览 1241

RuntimeError: wrapped C/C++ object of type TextCtrl has been deleted

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")这次在新添语句的地方报错了

大概明白错哪儿了,想请教一下解决办法

  • 写回答

3条回答 默认 最新

  • threenewbee 2020-07-30 18:13
    关注

    改用单线程访问看看是否正常,可能是线程同步的问题,主界面关闭了,另一个线程还在试图访问它

    评论

报告相同问题?

悬赏问题

  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记