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())
關鍵點:
1. SimpleHTTPRequestHandler:這是一個簡單的 HTTP 請求處理器,用于處理 GET 請求并返回響應。
2. WebServerThread:這是一個 QThread 子類,用于在后臺運行 Web 服務器,避免阻塞主線程。
3. 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 環境的電腦上運行。