单击按钮时如何防止我的服务器 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/
您也可以使用多处理库而不是线程
我是套接字编程的新手,目前正在尝试创建一个非常简单的 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/
您也可以使用多处理库而不是线程