PyQt6內嵌http.server Web 和Flask Web服務器方法詳解

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 環境的電腦上運行。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/73641.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/73641.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/73641.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【源碼分析】Nacos實例注冊流程分析-事件驅動框架

【踩坑記錄】 本人下載的Nacos 服務端版本是2.3.2&#xff0c;在開始進行源碼編譯便遇到問題&#xff0c;下面是各個問題記錄 源碼大量爆紅 在最開始用Idea加載Maven項目的時候&#xff0c;發現項目中大量的代碼爆紅&#xff0c;提示其類或者包不存在&#xff0c;后來結果查…

Unity物理射線濾除某層

關鍵點&#xff1a;使用LayerMask&#xff0c;針對Physics里檢測collider的射線&#xff08;raycast、OverlapSphere...&#xff09;都適用 1.使用layerMask過濾層 int ignoreLayer LayerMask.NameToLayer("IgnoreRaycast");// 獲取要忽略的層 int layerMask ~(1…

【白話神經網絡(二)】矩陣、CNN、RNN

全連接層 回顧前面學過的知識&#xff1a; 一個最簡單的神經網絡&#xff0c;就是ywxb 套上一個激活函數。 如果有多個輸入&#xff0c;那就是多個w和x 如果有多個輸出&#xff0c;那就再來一行公式&#xff0c;多一組w和b 要是神經元多了的話&#xff0c;公式密密麻麻的&…

Unity教程(二十二)技能系統 分身技能

Unity開發2D類銀河惡魔城游戲學習筆記 Unity教程&#xff08;零&#xff09;Unity和VS的使用相關內容 Unity教程&#xff08;一&#xff09;開始學習狀態機 Unity教程&#xff08;二&#xff09;角色移動的實現 Unity教程&#xff08;三&#xff09;角色跳躍的實現 Unity教程&…

深入解析Java面向對象三大特征之多態、final、抽象類與接口

面向對象編程&#xff08;OOP&#xff09;的三大核心特征為封裝、繼承、多態&#xff0c;其中多態是最具靈活性和擴展性的特性。本文將從多態的本質出發&#xff0c;結合final關鍵字、抽象類與接口的設計&#xff0c;深入探討這些概念的應用場景及其在代碼中的實現細節&#xf…

編碼器和解碼器概念及算法示例【清晰易懂】

編碼器&#xff08;Encoder&#xff09;和解碼器&#xff08;Decoder&#xff09;是處理信息的一對“搭檔”&#xff0c;它們的作用就像是“翻譯員”和“逆翻譯員”。 1. 編碼器&#xff08;Encoder&#xff09;是什么&#xff1f; &#x1f449; 把原始信息變成另一種形式&a…

爬蟲逆向:逆向中用到匯編語言詳細總結

更多內容請見: 爬蟲和逆向教程-專欄介紹和目錄 文章目錄 一、匯編語言基礎二、常見匯編指令2.1 數據傳輸指令2.2 算術指令2.3 邏輯指令2.4 控制流指令2.5 其他指令三、寄存器概述四、調用約定五、棧操作與函數調用六、逆向工程中的匯編分析七、常用逆向工具八、實際案例分析九…

CTF WEB題

[文件包含,少許難度] 地址:攻防世界 代碼審計WRONG WAY! <?php include("flag.php"); #包含了一個“flag.php”文件 highlight_file(__FILE__); #來顯示當前文件的源代碼 if(isset($_GET["file1"]) && isset($_GET["file2"])) #isse…

c++圖論(一)之圖論的起源和圖的概念

C 圖論之圖論的起源和圖的概念 圖論&#xff08;Graph Theory&#xff09;是數學和計算機科學中的一個重要分支&#xff0c;其起源可以追溯到 18 世紀 的經典問題。以下是圖論的歷史背景、核心起源問題及其與基本概念和用途&#xff1a; 借用一下CSDN的圖片哈 一、圖論的起源&…

Ollama + CherryStudio:構建本地私有知識庫

前面我們介紹了Ollama的安裝和使用&#xff0c;并通過Open-WebUI進行調用&#xff0c;相信大家對Ollama也有了一定的了解&#xff1b;這篇博文就結合Ollama工具和CherryStudio工具構建一個本地知識庫&#xff08;RAG&#xff09;&#xff1b;在進行接下來的操作之前&#xff0c…

【實戰ES】實戰 Elasticsearch:快速上手與深度實踐-8.2.1AWS OpenSearch無服務器方案

&#x1f449; 點擊關注不迷路 &#x1f449; 點擊關注不迷路 &#x1f449; 點擊關注不迷路 文章大綱 8.2.1AWS OpenSearch 無服務器方案深度解析與實踐指南1. Serverless架構的核心價值與行業趨勢1.1 傳統Elasticsearch集群的運維挑戰1.2 Serverless技術演進路線技術特性對比…

清晰易懂的Java8安裝教程

小白也能看懂的 Java 8 安裝教程&#xff08;JDK 和 JRE 分目錄安裝&#xff09; 本教程將手把手教你如何在 Windows 系統上安裝 Java 8&#xff08;JDK 1.8&#xff09;&#xff0c;并將 JDK 和 JRE 安裝到不同的目錄中&#xff0c;同時提供國內 Java 8 下載源和方法。即使你…

圖搜索的兩種寫法,廣度優先和深度優先

最近AI的爆發大家都瘋了&#xff0c;也確實夠瘋&#xff0c;前幾年誰能天天和AI聊天呢&#xff0c;特別它越來越智能&#xff0c;越來越理解你&#xff0c;你越來越離不開它&#xff0c;我很好奇將來它會不會有情緒&#xff0c;太可怕了&#xff0c;一旦有了這個就有了感情&…

嵌入式八股RTOS與Linux---前言篇

前言 Linux與RTOS是校招八股的時候很喜歡考察的知識,在這里并沒有把兩個操作系統完全的獨立開去講,放在一起對比或許可能加深印象。我們講Linux的內核有五部分組成:進程調度、內存管理、文件系統、網絡接口、進程間通信,所以我也將從這五方面出發 中斷管理去對比和RTOS的不同。…

ChatBI 的技術演進與實踐挑戰:衡石科技如何通過 DeepSeek 實現商業落地

隨著人工智能技術的快速發展&#xff0c;ChatBI&#xff08;基于自然語言交互的商業智能&#xff09;逐漸成為企業數據分析領域的熱門話題。作為 BI&#xff08;商業智能&#xff09;領域的新形態&#xff0c;ChatBI 通過自然語言處理&#xff08;NLP&#xff09;技術&#xff…

基于Vue實現Echarts的平滑曲線

在Vue2.x的項目中使用echarts實現如下效果 安裝echarts npm install echarts --save組件引入echarts // 在你的Vue組件中 import * as echarts from echarts;在模板中添加一個div元素&#xff0c;用來放置圖表 <divref"chart"class"chart"style"…

關于重構分析查詢界面的思考(未完)

業務系統里&#xff0c;查詢界面很常見&#xff0c;數據分析場景需求普遍而迫切&#xff0c;而新的技術也在不斷出現&#xff0c;很有必要重構分析查詢界面。 查詢篩選 為了盡可能從數據中發現&#xff0c;需要盡可能地將查詢條件添加進來&#xff0c;可這樣&#xff0c;查詢…

在jQuery中DOM操作

&#xff08;一&#xff09;元素選取 各種選擇器的使用方法與示例 標簽選擇器&#xff1a;通過 HTML 標簽名稱來選取元素。例如&#xff0c;若想選中頁面中所有的段落元素&#xff0c;可使用$(‘p’)。假設我們有如下 HTML 結構&#xff1a; 這是第一個段落 這是嵌套在div中的…

Java 集合框架中 `List` 接口及其子類的詳細介紹,并用 UML 圖表展示層次結構關系,用表格對比各個類的差異。

下面是 Java 集合框架中 List 接口及其子類的詳細介紹&#xff0c;并用 UML 圖表展示層次結構關系。最后&#xff0c;我會用表格對比各個類的差異。 Java 集合框架中 List 接口及其子類 UML 類圖描述 以下是 List 接口及其子類的 UML 類圖描述&#xff0c;不包含方法。 詳細…

Java面試八股—Redis篇

一、Redis的使用場景 &#xff08;一&#xff09;緩存 1.Redis使用場景緩存 場景&#xff1a;緩存熱點數據&#xff08;如用戶信息、商品詳情&#xff09;&#xff0c;減少數據庫訪問壓力&#xff0c;提升響應速度。 2.緩存穿透 正常的訪問是&#xff1a;根據ID查詢文章&…