Window tkinter 在与另一台设备连接时不显示
Window tkinter doesn't display when there is a connection with another device
- 我想连接 2 台计算机以制作一种信使,但我想使用
tkinter
,以便拥有 windows,并使用按钮和其他小部件来创建界面。
- 所以我有2个程序,一个是客户端,一个是服务端。
- 对于客户端,它有效:window 显示,我可以发送消息。
- 对于服务器,window不显示。
客户端程序:
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()
。
- 我想连接 2 台计算机以制作一种信使,但我想使用
tkinter
,以便拥有 windows,并使用按钮和其他小部件来创建界面。 - 所以我有2个程序,一个是客户端,一个是服务端。
- 对于客户端,它有效:window 显示,我可以发送消息。
- 对于服务器,window不显示。
客户端程序:
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()
。