Python 我需要一个GUI,当我的客户端接收到新数据时,它会不断更新
我在python中有一个客户机和一个服务器,我的服务器始终向我的客户机发送时间。然后,我的客户打印收到的时间、消息的长度以及完整消息的接收情况。我知道如何合并一个基本的GUI,但是当我合并的时候,数据流就在GUI所在的位置停止了。我需要GUI在接收时显示时间,并不断更新。 这是我的第一个python项目,所以我肯定我遗漏了一些东西 我真的不知道该怎么做。任何想法都是有用的 这是我的服务器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
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()