窗口 tkinter 在与其他设备连接时不显示


  • 我想连接两台计算机来制作一种信使,但我想使用tkinter,以便拥有窗口,并使用按钮和其他小部件来创建界面
  • 所以我有两个程序,一个是客户端,另一个是服务器。
    • 对于客户端,它是有效的:显示窗口,我可以发送消息
    • 对于服务器,该窗口不会显示

客户端程序:

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")

首先,即使您使用的是像Python IDLE一样使用tkinter制作的IDE,也应该显式调用mainloop()。否则,当脚本在终端中执行时,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()

最新更新