­

编写HoneyTalk遇到的那些坑

  • 2019 年 12 月 26 日
  • 筆記
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+'nn','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