单击按钮时如何防止我的服务器 Tkinter 应用程序冻结?

How to prevent my server Tkinter app from freezing when clicking a button?

我是套接字编程的新手,目前正在尝试创建一个非常简单的 GUI 应用程序,它要求服务器通过单击按钮连接到单个客户端。

问题是,应用程序总是死机,只有在连接到客户端后才会恢复正常。我做了一些研究,目前假设阻塞套接字导致了这个问题。还有其他原因吗?我该如何解决?

这是我的 server.py:

from tkinter import *
from tkinter import ttk
from socket import * 
                                         
def connect(): 
    global connectionSocket 
 
    serverPort = 12345
    socketServer = socket(AF_INET, SOCK_STREAM)
    socketServer.bind(('',serverPort))
    socketServer.listen(1) 
    print('The server is ready to receive') 
    
    while True:    
        connectionSocket, addr = socketServer.accept()
        connectionSocket.close()
        break
             
root = Tk()
root.title("Server App")
    
button_connect = ttk.Button(root,text = 'Connect', width = 20, command = connect)

button_connect.grid(row = 0, column = 0) 
            
root.mainloop() 

使用线程来防止您的应用冻结,您的连接功能将 运行 与 tkinter 应用并行

from tkinter import *
from tkinter import ttk
from socket import *
import threading
                                         
def connect(): 
    global connectionSocket 
 
    serverPort = 12345
    socketServer = socket(AF_INET, SOCK_STREAM)
    socketServer.bind(('',serverPort))
    socketServer.listen(1) 
    print('The server is ready to receive') 
    
    while True:    
        connectionSocket, addr = socketServer.accept()
        connectionSocket.close()
        break
    s=0

def connectit():
    global s
    if (s==0):
        t = threading.Thread(target=connect)
        t.start()
        s = 1
s = 0
root = Tk()
root.title("Server App")
    
button_connect = ttk.Button(root,text = 'Connect', width = 20, command = connectit)

button_connect.grid(row = 0, column = 0) 
            
root.mainloop()

你可以向她学习线程

https://realpython.com/intro-to-python-threading/

您也可以使用多处理库而不是线程

https://www.geeksforgeeks.org/multiprocessing-python-set-1/