我正在使用socket和tkinter与客户端和服务器。服务器应该向客户端发送消息,该消息将被添加到列表框中并在实时接收消息时显示给用户。但是,在与服务器的连接丢失(即服务器窗口已关闭)之前,根窗口不会显示。当根窗口出现时,消息仍会显示在列表框中,但只有在连接时才会出现。
这是服务器:
import socket
import sys
from tkinter import *
import tkinter.scrolledtext as tkst
#create a tcp/ip socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#connect the socket to the server's port
server_address = ("10.62.78.168", 8000)
p=('connecting to {} port {}'.format(*server_address))
sock.connect(server_address)
root=Tk()
root.title("client")
log=tkst.ScrolledText(root,width=100)
log.grid(padx=10,pady=10)
log.insert(END,p)
try:
while True:
p=(sock.recv(1024)).decode()
m=("\n<Server> "+p)
log.insert(END,m)
finally:
print('closing socket')
sock.close()
root.mainloop()
这是客户:
String msg ="BGM+EFD:20:109:GBP+aa:bb:cc+5+dd'CST++KindOfDeclaration+0'";
答案 0 :(得分:0)
在调用mainloop
之前,窗口不会出现,并且您在mainloop
之前运行了无限循环。解决方案是将从套接字读取的代码移动到一个线程中,以便它不会阻止GUI。然后,您需要使用线程安全队列来在工作线程和GUI线程之间进行通信。
答案 1 :(得分:0)
当客户端连接到套接字时,它会调用服务器的while循环。正如您所看到的那样,循环不会停止,直到某些内容从内部停止。由于没有任何东西可以终止它,它只会在异常发生时中断,即连接失败/掉线。
只有在这时,Python才会继续进行,并执行创建窗口的行。
如果您希望同时发生这两件事,您可能需要查看Threads:
thread.start_new_thread(connect_to_server);
其中connect_to_server()
将是您定义的用于连接和读取套接字数据的函数。
这样,while循环将在一个单独的线程上运行,而主循环将继续创建窗口。