Ich benutze Socket und Tkinter mit einem Client und Server. Der Server soll Nachrichten an den Client senden, die zu einer Listbox hinzugefügt und dem Benutzer angezeigt werden, während die Nachrichten in Echtzeit empfangen werden. Das Stammfenster wird jedoch erst angezeigt, wenn die Verbindung zum Server unterbrochen wurde (d. H. Das Serverfenster wurde geschlossen). Die Nachrichten werden weiterhin in der Listbox angezeigt, wenn das Stammfenster erscheint erscheint, aber nur nicht, während eine Verbindung besteht. HierDas tkinter-Root-Fenster wird nicht angezeigt, bis die Verbindung zum Server verloren gegangen ist
ist der Server:
import socket
import sys
#create a tcp/ip socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#print(socket.gethostbyname(socket.gethostname()))
#bind the socket to the port
server_address = (socket.gethostbyname(socket.gethostname()), 8000)
print('starting up on {} port {}'.format(*server_address))
sock.bind((socket.gethostname(),8000))
#listen for incoming connections
sock.listen(2)
while True:
#wait for connection
print('waiting for a connection')
connection, client_address = sock.accept()
try:
print('connection from', client_address)
host_name=socket.gethostname()
h=("connected to: "+host_name).encode()
connection.sendall(h)
while True:
print("enter a message")
m=input().encode()
connection.sendall(m)
finally:
#end the communication
connection.close()
und hier ist der Kunde:
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()