PyQt 与 Flask 融合:实现桌面端一键启动/关闭 Web 服务的应用

PyQt 与 Flask 融合:实现桌面端一键启动/关闭 Web 服务的应用

结合 PyQt 与 Flask,你可以轻松打造一个桌面应用,实现对本地 Web 服务的一键启动与停止。本文将以一个完整示例演示如何做,并详细讲解每个关键步骤,适合希望将可视化界面与后台 API 服务整合的开发者参考。


1. 项目简介

我们将创建一个简单的 PyQt5 桌面应用,界面有两个按钮:"启动 Flask App"和"停止 Flask App"。点击按钮即可在本地后台启动或关闭 Flask Web 服务(默认监听 127.0.0.1:5000)。

2. 环境准备

请确保已安装以下库:

bash 复制代码
pip install PyQt5 flask

3. 全部代码

下面是完整的实现代码,并附有详细注释:

python 复制代码
import sys, webbrowser
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget
from PyQt5.QtCore import QTimer
from flask import Flask
from werkzeug.serving import make_server
from multiprocessing import Process

# Flask app 和之前一样
flask_app = Flask(__name__)

@flask_app.route('/')
def hello_world():
    return 'Hello, World!'

server = None
flask_process = None

def run_flask_app():
    global server
    wsgi_app = flask_app.wsgi_app
    server = make_server('127.0.0.1', 5003, wsgi_app)
    server.serve_forever()

def start_flask_process():
    global flask_process
    flask_process = Process(target=run_flask_app)
    flask_process.start()

def stop_flask_app():
    global server, flask_process
    if server:
        server.shutdown()
        server = None
    if flask_process:
        flask_process.terminate()
        flask_process = None

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('PyQT Flask Demo')
        self.setGeometry(100, 100, 400, 200)
        self.start_button = QPushButton('Start Flask App')
        self.start_button.clicked.connect(self.start_flask_and_open_web)
        self.stop_button = QPushButton('Stop Flask App')
        self.stop_button.clicked.connect(self.stop_flask_app)
        layout = QVBoxLayout()
        layout.addWidget(self.start_button)
        layout.addWidget(self.stop_button)
        main_widget = QWidget()
        main_widget.setLayout(layout)
        self.setCentralWidget(main_widget)

    def start_flask_and_open_web(self):
        start_flask_process()
        QTimer.singleShot(1000, lambda: webbrowser.open("http://127.0.0.1:5003"))

    def stop_flask_app(self):
        stop_flask_app()

if __name__ == '__main__':
    qt_app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(qt_app.exec_())

4. 关键点说明

  • 多进程启动 Flask :

    Flask 自身适用于开发环境,理论上可直接用 app.run(),但和 GUI 线程混用容易阻塞界面;因此用 multiprocessing 分离出来。

  • 按钮实现 :

    使用 PyQt5 的信号/槽机制将按钮点击与启动/停止 Flask 操作绑定。

  • 平滑关停 :

    用 server.shutdown() 和 process.terminate() 方法确保 Flask 服务可以被正常关闭和回收资源。


5. 运行效果

运行后你会看到如下界面:

  • 点击"Start Flask App"即在本地 http://127.0.0.1:5000 出现 Hello, World! 页面。
  • 点击"Stop Flask App"及时关闭服务,网页访问失效。

6. 扩展思路

  • 可以为 Flask 增加更多 API 路由功能,实现桌面端-服务端交互;
  • 可以整合到企业客户端实现一键本地服务、多端通信等应用场景;
  • 若需生产环境使用,请考虑用 gunicorn、waitress等 WSGI 服务器,并处理多端口/多进程切换和异常管理。

本文代码及其思路适合用于开发调试工具、本地化桌面助手、数据展示仪表盘等实用场景。

相关推荐
LuHang2 分钟前
Vue3 大屏项目 MQTT 实战:机场与无人机 OSD 实时数据总线
前端
2401_885885047 分钟前
芬兰语音通知接口怎样对接?语音提醒接入流程
android·前端·python·php·语音识别
铁皮饭盒14 分钟前
这6个小模型各有绝活, 且都可cpu/浏览器端运行
前端·后端
徐小夕22 分钟前
JitKnow AI知识库 4.7 发布|多文档推理+拖拽 Agent + 技能库,打造更懂业务的 AI 知识中台
前端·vue.js·github
小poop1 小时前
从“雷峰塔”到“对象”:JavaScript基础语法入门指南
前端·javascript
ReStock活库1 小时前
Zephyr异步SPI调用返回后,为什么不能立即复用发送缓冲区?
java·前端·网络
计算机魔术师1 小时前
半年营收163亿,算力债却到7800亿,这账谁算得清
前端
chunyublog2 小时前
HDFS 上传文件名空格问题排障教程
前端·javascript·npm
?abc!2 小时前
(贪心)621. 任务调度器
java·前端·c#
摸鱼仙人~2 小时前
校招帮简历字段匹配架构分析报告
java·前端·架构