编写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