Python 我需要一个GUI,当我的客户端接收到新数据时,它会不断更新

Python 我需要一个GUI,当我的客户端接收到新数据时,它会不断更新,python,user-interface,networking,tkinter,Python,User Interface,Networking,Tkinter,我在python中有一个客户机和一个服务器,我的服务器始终向我的客户机发送时间。然后,我的客户打印收到的时间、消息的长度以及完整消息的接收情况。我知道如何合并一个基本的GUI,但是当我合并的时候,数据流就在GUI所在的位置停止了。我需要GUI在接收时显示时间,并不断更新。 这是我的第一个python项目,所以我肯定我遗漏了一些东西 我真的不知道该怎么做。任何想法都是有用的 这是我的服务器 import socket import time HEADERSIZE = 10 s = socke

我在python中有一个客户机和一个服务器,我的服务器始终向我的客户机发送时间。然后,我的客户打印收到的时间、消息的长度以及完整消息的接收情况。我知道如何合并一个基本的GUI,但是当我合并的时候,数据流就在GUI所在的位置停止了。我需要GUI在接收时显示时间,并不断更新。 这是我的第一个python项目,所以我肯定我遗漏了一些东西

我真的不知道该怎么做。任何想法都是有用的

这是我的服务器

import socket
import time


HEADERSIZE = 10

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((socket.gethostname(), 1243))
s.listen(5)

while True:
    # now our endpoint knows about the OTHER endpoint.
    clientsocket, address = s.accept()
    print(f"Connection from {address} has been established.")

    msg = "Welcome to the server!"
    msg = f"{len(msg):<{HEADERSIZE}}"+msg

    clientsocket.send(bytes(msg,"utf-8"))

while True:
    time.sleep(3)
    msg = f"The time is {time.time()}"
    msg = f"{len(msg):<{HEADERSIZE}}"+msg

    print(msg)

    clientsocket.send(bytes(msg,"utf-8"))
这是服务器的结果:

已建立从('169.254.91.3',64486'的连接

29时间是1563997982.918763

30时间是1563997985.9197025

0时间是1563997988.9197063

这就是客户的结果:

新msg len:b'22 ' 完整信息长度:22

三十二

全味精回收

欢迎来到服务器

新味精:b'29 ' 完整信息长度:29

三十九

全味精回收

时间是156397982.918763

新味精:b'30 ' 完整信息长度:30

四十

全味精回收

时间是156397985.9197025

新味精:b'30 ' 完整信息长度:30

四十

全味精回收


时间是1563997988.9197063

您可以创建一个
文本
框来捕获收到的消息。为了不阻塞GUI主循环,您需要使用线程来处理服务器连接。以下是一个例子:

import socket
import threading
from tkinter import *

HEADERSIZE = 10

# function to handle server connection
def connect_server(logbox):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((socket.gethostname(), 1243))

    while True:
        msg = s.recv(60).decode()
        print(msg)
        msglen = int(msg[:HEADERSIZE])
        if len(msg) == msglen+HEADERSIZE:
            logbox.insert(END, f'{msg[HEADERSIZE:]}\n')
        else:
            logbox.insert(END, 'Received invalid message\n')
        logbox.see(END)

# create the GUI
root = Tk()
logbox = Text(root, width=60, height=10)
logbox.pack(fill=BOTH, expand=1)
# start the server handling thread
threading.Thread(target=lambda:connect_server(logbox), daemon=True).start()
# start the GUI mainloop
root.mainloop()

你的GUI代码在哪里?pygame?从客户机代码的第12行开始,发布的代码存在缩进问题。服务器代码似乎也有缩进问题。谢谢你,我知道我没有给你太多的东西,但这很有效,帮助我理解了很多。
import socket
import threading
from tkinter import *

HEADERSIZE = 10

# function to handle server connection
def connect_server(logbox):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((socket.gethostname(), 1243))

    while True:
        msg = s.recv(60).decode()
        print(msg)
        msglen = int(msg[:HEADERSIZE])
        if len(msg) == msglen+HEADERSIZE:
            logbox.insert(END, f'{msg[HEADERSIZE:]}\n')
        else:
            logbox.insert(END, 'Received invalid message\n')
        logbox.see(END)

# create the GUI
root = Tk()
logbox = Text(root, width=60, height=10)
logbox.pack(fill=BOTH, expand=1)
# start the server handling thread
threading.Thread(target=lambda:connect_server(logbox), daemon=True).start()
# start the GUI mainloop
root.mainloop()