在与服务器的连接丢失之前,tkinter根窗口不会显示

时间:2017-06-15 12:50:08

标签: python-3.x sockets tkinter

我正在使用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'";

2 个答案:

答案 0 :(得分:0)

在调用mainloop之前,窗口不会出现,并且您在mainloop之前运行了无限循环。解决方案是将从套接字读取的代码移动到一个线程中,以便它不会阻止GUI。然后,您需要使用线程安全队列来在工作线程和GUI线程之间进行通信。

答案 1 :(得分:0)

当客户端连接到套接字时,它会调用服务器的while循环。正如您所看到的那样,循环不会停止,直到某些内容从内部停止。由于没有任何东西可以终止它,它只会在异常发生时中断,即连接失败/掉线。

只有在这时,Python才会继续进行,并执行创建窗口的行。

如果您希望同时发生这两件事,您可能需要查看Threads

 thread.start_new_thread(connect_to_server);

其中connect_to_server()将是您定义的用于连接和读取套接字数据的函数。

这样,while循环将在一个单独的线程上运行,而主循环将继续创建窗口。