微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

与另一台设备建立连接时,tkinter窗口不显示

如何解决与另一台设备建立连接时,tkinter窗口不显示

  • 我想连接两台计算机以创建某种Messenger,但我想使用tkinter来具有窗口,并使用按钮和其他小部件来创建界面。
  • li>
  • 所以我有2个程序,一个是客户端,另一个是服务器。
    • 对于客户端而言,它起作用:显示窗口,我可以发送消息。
    • 对于服务器,该窗口不显示

客户端程序:

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 举报,一经查实,本站将立刻删除。