在python3中,如何做到通过两个按钮来开启/关闭 httpServer?

如图,这是我定义的http服务类,并写了一个start函数和shutdown函数,但是通过按钮事件访问start函数的时候,由于server.serve_forever()函数循环的问题导致程序未响应,没有办法点击另一个按钮

我也试过多线程的方式处理,但是server对象没办法在两个函数之间共享,请问有什么解决办法吗,还是说我思路不对(本人python新手)

您可以使用多线程或多进程来处理HTTP服务器和按钮事件之间的并发性问题。您可以将HTTP服务器的运行放在一个线程或进程中,并将按钮事件处理放在另一个线程或进程中。
以下是一个示例,展示了如何使用多线程来处理HTTP服务器和按钮事件:

import threading
from http.server import HTTPServer

class RequestHandler(BaseHTTPRequestHandler):
    def do_POST(self):
        content_length = int(self.headers['Content-Length'])
        post_data = self.rfile.read(content_length)
        print("POST request, InPath: {}, Headers: {}, Body: {}".format(
            str(self.path), str(self.headers), post_data.decode("utf-8")))
        res = "You Input: " + post_data.decode("utf-8")
        self.do_HEAD()
        self.wfile.write("{}".format(res).encode('utf-8'))

    def do_HEAD(self):
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()

class MyHTTPServer(HTTPServer):
    def __init__(self, host, port):
        super().__init__((host, port), RequestHandler)

    def run(self):
        self.serve_forever()

def start_http_server():
    http_server = MyHTTPServer('localhost', 8000)
    http_server.run()

def handle_button_event():
    # 处理按钮事件的代码
    pass

def start_server_and_handle_button():
    server_thread = threading.Thread(target=start_http_server)
    server_thread.start()

    handle_button_event()

start_server_and_handle_button()

在上面的代码中,start_http_server函数创建了一个自定义的MyHTTPServer对象,并在一个单独的线程中调用run方法来启动服务器。
handle_button_event函数是您处理按钮事件的代码。您可以在这个函数中实现您的按钮逻辑。
最后,start_server_and_handle_button函数启动了HTTP服务器线程和按钮事件处理,它们可以并发运行。
请注意,这只是一个简单示例,以帮助您理解如何在多线程环境中处理HTTP服务器和按钮事件。实际应用可能需要更复杂的线程同步和管理。另外,如果您的应用程序需要更高级的并发性和可扩展性,您可能需要考虑使用异步编程库,如asyncio或aiohttp。