編寫HoneyTalk遇到的那些坑
- 2019 年 12 月 26 日
- 筆記
#獲取本機電腦名 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