PyQt6 可以内嵌一个简单的 Web 服务器。虽然 PyQt6 本身不提供直接的 Web 服务器功能,但可以结合 Python 的标准库(如 http.server)或其他 Web 框架(如 Flask、FastAPI 等)来实现。
示例:使用 http.server内嵌 Web 服务器
以下是一个简单的例子,展示如何在 PyQt6 应用中内嵌一个基本的 Web 服务器:
import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QTextEdit
from PyQt6.QtCore import QThread, pyqtSignal
from http.server import BaseHTTPRequestHandler, HTTPServer
class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
self.wfile.write(b"Hello from PyQt6 Web Server!")
class WebServerThread(QThread):
def run(self):
server_address = ('', 8000)
httpd = HTTPServer(server_address, SimpleHTTPRequestHandler)
print("Web server running on port 8000...")
httpd.serve_forever()
class MainWindow(QMainWindow):
def init(self):
super().init()
self.setWindowTitle("PyQt6 Web Server Example")
self.text_edit = QTextEdit(self)
self.setCentralWidget(self.text_edit)
self.text_edit.setText("Web server is running...")
self.webserver_thread = WebServerThread()
self.webserver_thread.start()
if name == "main":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())
关键点:
-
SimpleHTTPRequestHandler:这是一个简单的 HTTP 请求处理器,用于处理 GET 请求并返回响应。
-
WebServerThread:这是一个 QThread 子类,用于在后台运行 Web 服务器,避免阻塞主线程。
-
MainWindow:这是 PyQt6 的主窗口,启动时会在后台运行 Web 服务器。
运行效果:
-
运行程序后,Web 服务器会在 http://localhost:8000上启动。
-
访问该地址时,会看到 "Hello from PyQt6 Web Server!" 的响应。
-
PyQt6 应用的主窗口会显示 "Web server is running..."。
注意事项:
- 这种方法适合简单的场景。如果需要更复杂的功能(如路由、模板渲染等),建议使用 Flask 或 FastAPI 等框架。
Pyqt6内嵌Flask框架完整的示例代码:
from flask import Flask, render_template_string
app = Flask(name)
@app.route('/')
def index():
return render_template_string('''
<h1>Hello, Flask in PyQt6!</h1>
<p>This is a Flask application embedded in PyQt6.</p>
''')
PyQt6 主程序 (main.py)
import sys
from PyQt6.QtWidgets import QApplication, QMainWindow
from PyQt6.QtWebEngineWidgets import QWebEngineView
from PyQt6.QtCore import QUrl
import threading
import time
from werkzeug.serving import make_server
from flask_app import app
class FlaskThread(threading.Thread):
def init(self, app):
threading.Thread.init(self)
self.server = make_server('127.0.0.1', 5000, app)
self.ctx = app.app_context()
self.ctx.push()
def run(self):
self.server.serve_forever()
def shutdown(self):
self.server.shutdown()
class MainWindow(QMainWindow):
def init(self):
super().init()
self.setWindowTitle("PyQt6 with Flask")
self.setGeometry(100, 100, 800, 600)
self.browser = QWebEngineView()
self.setCentralWidget(self.browser)
self.start_flask()
def start_flask(self):
self.flask_thread = FlaskThread(app)
self.flask_thread.start()
time.sleep(1)
self.browser.setUrl(QUrl("http://127.0.0.1:5000"))
def closeEvent(self, event):
self.flask_thread.shutdown()
event.accept()
if name == 'main':
qt_app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(qt_app.exec())
打包命令
pyinstaller --onefile --windowed --add-data "flask_app.py;." main.py
通过以上步骤,你可以将 PyQt6 内嵌 Flask 的应用打包成一个独立的可执行文件,并在没有 Python 环境的电脑上运行。