編寫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