Window tkinter 在与另一台设备连接时不显示

Window tkinter doesn't display when there is a connection with another device

客户端程序:

import socket
from tkinter import *

def envoyer_msg():
    s.send(msg.get().encode())

fenetre=Tk()
fenetre.geometry("{}x{}+{}+{}".format(200,200,200,200))

texte=Label(fenetre,text="CLIENT",font=25)
texte.pack()

msg=StringVar()
saisie=Entry(fenetre,textvariable=msg,font=25)
saisie.pack()

bouton_envoyer=Button(fenetre,text="Envoyer",font=25,command=envoyer_msg)
bouton_envoyer.pack()

s = socket.socket()
s.connect(('127.0.0.1',12345))

这里是服务器程序:

import socket
from tkinter import *

def envoyer_msg():
    c.send(msg.encode())

fenetre=Tk()
fenetre.geometry("{}x{}+{}+{}".format(200,200,200,200))

texte=Label(fenetre,text="SERVEUR",font=25)
texte.pack()

msg=StringVar()
saisie=Entry(fenetre,textvariable=msg,font=25)
saisie.pack()

bouton_envoyer=Button(fenetre,text="Envoyer",font=25,command=envoyer_msg)
bouton_envoyer.pack()

print("1")

s = socket.socket()
port = 12345
s.bind(('', port))
s.listen(5)
c, addr = s.accept()
print ("Socket Up and running with a connection from",addr)

print("2")

while True:
    rcvdData = c.recv(1024).decode()
    print ("S:",rcvdData)

    print("3")

首先你应该显式地调用 mainloop(),即使你正在使用一个由 tkinter 制作的 IDE 就像 Python IDLE。否则在终端中执行脚本时,GUI 将不会显示。


服务器 GUI 未显示,因为 while 循环阻塞了 mainloop()。您需要将客户端连接处理任务放在一个线程中:

# server code
import socket
import threading
from tkinter import *

def envoyer_msg():
    c.send(msg.get().encode())

fenetre=Tk()
fenetre.geometry("{}x{}+{}+{}".format(200,200,200,200))

texte=Label(fenetre,text="SERVEUR",font=25)
texte.pack()

msg=StringVar()
saisie=Entry(fenetre,textvariable=msg,font=25)
saisie.pack()

bouton_envoyer=Button(fenetre,text="Envoyer",font=25,command=envoyer_msg)
bouton_envoyer.pack()

def server_task():
    global c

    s = socket.socket()
    port = 12345
    s.bind(('', port))
    s.listen(5)

    while True:
        print('waiting connection ...')
        c, addr = s.accept()
        print ("Socket Up and running with a connection from", addr)

        while True:
            try:
                rcvdData = c.recv(1024).decode()
                print ("Client:", rcvdData)
            except ConnectionResetError:
                print('Client disconnected')
                break

# start the client connection handling thread
threading.Thread(target=server_task, daemon=True).start()
fenetre.mainloop()


同样适用于客户端:

# client code
import socket
import threading
from tkinter import *

def envoyer_msg():
    s.send(msg.get().encode())

fenetre=Tk()
fenetre.geometry("{}x{}+{}+{}".format(200,200,400,200))

texte=Label(fenetre,text="CLIENT",font=25)
texte.pack()

msg=StringVar()
saisie=Entry(fenetre,textvariable=msg,font=25)
saisie.pack()

bouton_envoyer=Button(fenetre,text="Envoyer",font=25,command=envoyer_msg)
bouton_envoyer.pack()

def client_task():
    global s
    s = socket.socket()
    s.connect(('127.0.0.1',12345))
    while True:
        try:
            rcvdData = s.recv(1024).decode()
            print('Server:', rcvdData)
        except ConnectionResetError:
            print('Server disconnected')
            fenetre.destroy()

# start the server connection thread
threading.Thread(target=client_task, daemon=True).start()
fenetre.mainloop()

既然您想使用 GUI,最好使用 Text 小部件来保存对等消息,而不是使用 print()