前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >编写HoneyTalk遇到的那些坑

编写HoneyTalk遇到的那些坑

作者头像
聪明的瓦肯人
修改2019-12-28 11:13:46
6120
修改2019-12-28 11:13:46
举报
文章被收录于专栏:工科生日常工科生日常
bug这种东西 总会在你意想不到的地方出现 有些时候是你主动犯的错 而有些时候 完全是你曾经的无知觉错误 什么意思? 比如说 在HoneyTalkHe服务器中 有一段获取本地地址的代码
#获取本机电脑名
myname = socket.gethostname()
#获取本机ip
myaddr = socket.gethostbyname(myname)

是否能正确获取 与你所安装的虚拟机(如果你装了) 是否被禁用网络连接有关

如果不禁用或者没有其他方法避开 你获取的网络地址 会是虚拟机的 如下图粗实线

此之外 一定要注意 tkinter GUI程序与线程的关系 你可能觉得这有什么好注意的 这是由于如果你将GUI现在了非主线程中 会出现错误 RuntimeError: main thread is not in main loop 这是为什么呢? 我们先来看一下官方说法

如果要保证线程安全 你需要在主线程中编写tkinter GUI 其更深入的原因是

_tkinter模块会以拉取技术去获取主线程控制 而将GUI写在其他线程 会阻止这一行为 从而出错 些问题都或多或少可查询 但是 有些问题则显得无力 比如 服务端程序中 在函数rec()中 会有root.quit()

def rec():
    while True:
        try:
            msg = sock.recv(1024)
            gui.out.config(state = 'normal')
            con = bytes.decode(msg)
            gui.out.insert(END,'SHE:'+con+'\n\n','tag0')
            gui.out.see(END)
            gui.out.config(state = 'disable')
        except:
            sock.shutdown(2)
            sock.close()
            break
    # 退出mainloop
    root.quit()
    

if __name__ == '__main__':
    while True:
        sock,addr = s.accept()

        t1 = threading.Thread(target = rec,name = 'rec')
        t1.setDaemon(True)
        
        create()
        t1.start()
        root.mainloop()
        # 彻底关掉界面
        root.destroy()

本应拿来关闭GUI 事实上它只起到退出GUI mainloop()的作用 之后还得添加一行root.destroy()彻底关闭界面 当你将root.quit()替换为root.destroy()时 又会造成t1线程难以退出的问题 你说尴不尴尬

不知道哪位大神可以带带我 算啦 不说了 说多了都是泪 建议大家自己尝试 去修改,去踩坑 提前祝大家圣诞快乐! over

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 工科生日常 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档