#获取本机电脑名
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