使用PySide2嵌套HTML使用Flask响应

1. project 结构

项目结构

  1. dist文件夹为前端内容文件夹,其中包括前端的html, css, js等内容;

  2. pyside_flask_desk文件夹内**init.py**文件为创建Qt窗口,并使用线程启动flask;

  3. run_test.py为程序主入口;

2. 程序主入口 run_test.py

#! -*- coding:utf-8 -*-
import sys
import os
from app import *
from PySide2.QtCore import QFileInfo
from pyside_flask_desk import init_gui

sys.path.append((os.path.dirname(os.path.abspath(os.path.dirname(__file__)))).replace("\\", "/"))


if __name__ == '__main__':
    root = QFileInfo(__file__).absolutePath()
    init_gui(app, port=5000, window_title="pyside2_test", icon=root + "/dist/favicon.ico")


注意:其中icon的路径必须使用绝对路径,相对路径无法加载

3. init_gui 函数创建Qt主窗口,线程启动flask

import sys
from PySide2 import QtCore, QtWidgets, QtGui, QtWebEngineWidgets
import socket


class ApplicationThread(QtCore.QThread):
    def __init__(self, application, port=5000):
        super(ApplicationThread, self).__init__()
        self.application = application
        self.port = port

    def __del__(self):
        self.wait()

    def run(self):
        # flask app.run()
        self.application.run(port=self.port, threaded=True)


class WebPage(QtWebEngineWidgets.QWebEnginePage):
    def __init__(self, root_url):
        super(WebPage, self).__init__()
        self.root_url = root_url

    def home(self):
        self.load(QtCore.QUrl(self.root_url))

        
def init_gui(application, icon, port, width=800, height=600,
             window_title="PyFladesk", argv=None):
    if argv is None:
        argv = sys.argv

    # 创建主窗口框架
    qtapp = QtWidgets.QApplication(argv)
    
    # 线程启动flask
    webapp = ApplicationThread(application, port)
    webapp.start()
    # connect function:关闭qtapp窗口时,调用flask的终止
    qtapp.aboutToQuit.connect(webapp.terminate) 

    # 创建主窗口,并设置大小,标题,icon
    window = QtWidgets.QMainWindow()
    window.resize(width, height)
    window.setWindowTitle(window_title)
    window.setWindowIcon(QtGui.QIcon(icon))

    # 创建WebEngineView并套入主窗口
    webView = QtWebEngineWidgets.QWebEngineView(window)
    window.setCentralWidget(webView)

    # 通过home()加载url,并将page放入view
    page = WebPage('http://localhost:{}'.format(port))
    page.home()
    webView.setPage(page)
	
    # 显示窗口
    window.show()
    # 进入程序的主循环直到exit()被调用
    return qtapp.exec_()

4. app.py flask后端响应

from flask import Flask,  render_template

app = Flask(__name__, static_url_path='', static_folder='dist', template_folder='dist')


app.config['EXPLAIN_TEMPLATE_LOADING'] = True

# 路由
@app.route('/')
def greet():
    return render_template('index.html')


注意:其中static_url_path=''不可缺少,是由于前端html中将资源加载的目录写死为根目录。

static_folder='dist', template_folder='dist'根据具体project的实际情况写html, css等文件在的文件夹即可。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值