如何解决与另一台设备建立连接时,tkinter窗口不显示
客户端程序:
import socket
from tkinter import *
def envoyer_msg():
s.send(msg.get().encode())
fenetre=Tk()
fenetre.geometry("{}x{}+{}+{}".format(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,text="SERVEUR",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")
解决方法
首先,即使您正在使用由<!--
This is the minimum valid AMP HTML document. Type away
here and the AMP Validator will re-check your document on the fly.
-->
<!DOCTYPE html>
<html ⚡>
<head>
<meta charset="utf-8" />
<link rel="canonical" href="self.html" />
<meta name="viewport" content="width=device-width,minimum-scale=1" />
<style amp-boilerplate>
body {
-webkit-animation: -amp-start 8s steps(1,end) 0s 1 normal both;
-moz-animation: -amp-start 8s steps(1,end) 0s 1 normal both;
-ms-animation: -amp-start 8s steps(1,end) 0s 1 normal both;
animation: -amp-start 8s steps(1,end) 0s 1 normal both;
}
@-webkit-keyframes -amp-start {
from {
visibility: hidden;
}
to {
visibility: visible;
}
}
@-moz-keyframes -amp-start {
from {
visibility: hidden;
}
to {
visibility: visible;
}
}
@-ms-keyframes -amp-start {
from {
visibility: hidden;
}
to {
visibility: visible;
}
}
@-o-keyframes -amp-start {
from {
visibility: hidden;
}
to {
visibility: visible;
}
}
@keyframes -amp-start {
from {
visibility: hidden;
}
to {
visibility: visible;
}
}
</style>
<noscript>
<style amp-boilerplate>
body {
-webkit-animation: none;
-moz-animation: none;
-ms-animation: none;
animation: none;
}
</style>
</noscript>
<script async src="https://cdn.ampproject.org/v0.js"></script>
<script async custom-element="amp-form" src="https://cdn.ampproject.org/v0/amp-form-0.1.js"></script>
</head>
<body>
<h2>First form</h2>
<form id="secondForm" method="post" target="_top" action-xhr="https://amp.dev/documentation/examples/api/echo">
<input type="hidden" value="hiddenValue">
<div submit-success>Second form send successful!</div>
<div submit-error>Second form send failed!</div>
</form>
<hr>
<h2>Second form</h2>
<form id="firstForm" method="post" target="_top" action-xhr="https://amp.dev/documentation/examples/api/verify-form-input-text-xhr" on="submit-success:secondForm.submit">
<button type="submit">Submit</button>
<div submit-success>First form send successful!</div>
<div submit-error>First form send failed!</div>
</form>
</body>
</html>
制成的IDE(如Python IDLE),也应显式调用mainloop()
。否则,在终端中执行脚本时,GUI不会显示。
因为tkinter
循环阻止while
,所以服务器GUI不会显示。您需要将客户端连接处理任务放在一个线程中:
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))
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()
由于要使用GUI,因此最好使用# client code
import socket
import threading
from tkinter import *
def envoyer_msg():
s.send(msg.get().encode())
fenetre=Tk()
fenetre.geometry("{}x{}+{}+{}".format(200,400,text="CLIENT",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()
小部件来保存对等消息,而不要使用Text
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。