Python 服务器创建后 GUI 没有响应
Python GUI doesn't respond after the server creation
我尝试制作一个 Tkinter GUI,您可以在其中指定端口并使用给定端口创建本地服务器,但是当我尝试执行脚本时,本地服务器可以工作,但 GUI 不想再回复一下。
脚本源代码如下:
https://github.com/Medshi8/Random_Gui/blob/main/testServer.py
尝试在单独的线程上执行该功能,例如:
import threading
....
localcnct = Button(CreatserverFrame, text="Creat Server", fg="green" , command=threading.Thread(target=LocalServ).start)
localcnct.grid(row = 1, column = 2, rowspan= 2 , ipady = 10, ipadx = 5)
这应该允许您在除 tkinters 线程之外的单独线程上启动该函数,当您 运行 此 LocalServ()
时,它不会冻结 GUI。请记住,多次按下按钮会出现错误。
但是由于 GUI 从不响应,我不认为正在创建服务器(在创建过程中)。 GUI响应的时间,就是创建服务器的时间。
下面是一个简单的例子运行服务器在一个线程中:
import tkinter as tk
import threading
from http.server import HTTPServer, BaseHTTPRequestHandler
class Serv(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.end_headers()
self.wfile.write(b'Hello')
server = None
def LocalServ():
global server
def server_task():
print('Starting server ...')
httpd = HTTPServer(('localhost', 8000), Serv)
httpd.serve_forever()
# make sure only one server task is running
if server is None:
server = threading.Thread(target=server_task, daemon=True)
server.start()
root = tk.Tk()
root.geometry('400x300')
tk.Button(root, text='Start Server', command=LocalServ).pack()
root.mainloop()
我尝试制作一个 Tkinter GUI,您可以在其中指定端口并使用给定端口创建本地服务器,但是当我尝试执行脚本时,本地服务器可以工作,但 GUI 不想再回复一下。
脚本源代码如下:
https://github.com/Medshi8/Random_Gui/blob/main/testServer.py
尝试在单独的线程上执行该功能,例如:
import threading
....
localcnct = Button(CreatserverFrame, text="Creat Server", fg="green" , command=threading.Thread(target=LocalServ).start)
localcnct.grid(row = 1, column = 2, rowspan= 2 , ipady = 10, ipadx = 5)
这应该允许您在除 tkinters 线程之外的单独线程上启动该函数,当您 运行 此 LocalServ()
时,它不会冻结 GUI。请记住,多次按下按钮会出现错误。
但是由于 GUI 从不响应,我不认为正在创建服务器(在创建过程中)。 GUI响应的时间,就是创建服务器的时间。
下面是一个简单的例子运行服务器在一个线程中:
import tkinter as tk
import threading
from http.server import HTTPServer, BaseHTTPRequestHandler
class Serv(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.end_headers()
self.wfile.write(b'Hello')
server = None
def LocalServ():
global server
def server_task():
print('Starting server ...')
httpd = HTTPServer(('localhost', 8000), Serv)
httpd.serve_forever()
# make sure only one server task is running
if server is None:
server = threading.Thread(target=server_task, daemon=True)
server.start()
root = tk.Tk()
root.geometry('400x300')
tk.Button(root, text='Start Server', command=LocalServ).pack()
root.mainloop()