PyQt5快速入門(七)PyQt5擴展

PyQt5快速入門(七)PyQt5擴展

1、PyQt5項目發佈

一、PyInstaller簡介

PyInstaller是一款免費易用的打包工具,支持Windows、Linux、MacOS,而且支持32位和64位系統。
http://www.pyinstaller.org/
PyInstaller安裝:
pip install pyinstallerjavascript

二、PyInstaller使用

PyInstaller使用命令以下:
pyinstaller yourprogram.py
PyInstaller使用時需切換至xxx.py文件所在目錄下。
經常使用可選項以下:
-F:打包後只生成單個可執行文件
-D:默認選項,建立一個目錄,包含可執行文件以及大量依賴文件
-c:默認選項,使用控制檯
-w:不使用控制檯
-p:添加搜索路徑,讓其找到對應的庫
-i:改變生成程序的icon圖標。html

三、PyInstaller原理

PyInstaller將Python解釋器和Python腳本打包成一個可執行文件,並無編譯爲機器碼。PyInstaller打包的可執行文件不會提升運行效率,並且可能會下降運行效率。打包的優點是在運行機器上不用安裝Python和Python腳本所依賴的庫。在Linux系統下,PyInstaller主要使用binutil工具包中的ldd和objdump命令。
PyInstaller會分析指定的Python腳本所依賴的其它依賴,而後進行查找和複製,把全部的依賴都收集起來並進行加密處理,包括Python解釋器,最後將文件打包到一個目錄或打包到可執行文件中。
使用PyInstaller打包生成的可執行文件,只能在和打包機器相同的環境下運行,若是要在不一樣的操做系統上運行,必須在新的操做系統環境上從新打包。java

2、網頁交互

一、QWebEngineView簡介

PyQt5使用QWebEngineView來展現HTML頁面,WebEngine是基於谷歌Chromium引擎開發的,PyQt5中可使用PyQt5.QtWebKitWidgets.QWebEngineView來使用網頁控件。
QWebEngineView使用load(QUrl url)加載指定的URL定顯示,setHtml(QString &html)用於將網頁視圖的內容設置爲指定的HTML內容。
QWebEngineView使用load加載一個Web頁面,實際是使用HTTP GET方法加載Web頁面。web

二、加載顯示外部Web頁面

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtWebEngineWidgets import *

class MainWindow(QWidget):

    def __init__(self, parent=None):
        super().__init__(parent)
        self.layout = QVBoxLayout()
        self.browser = self.browser = QWebEngineView()
        self.layout.addWidget(self.browser)
        self.setLayout(self.layout)
        self.browser.load(QUrl("http://www.51cto.com/"))

        self.setWindowTitle("HuaWei Web")
        self.setGeometry(5, 30, 1355, 730)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()

    sys.exit(app.exec_())

三、加載本地Web頁面

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtWebEngineWidgets import *

class MainWindow(QWidget):

    def __init__(self, parent=None):
        super().__init__(parent)
        self.layout = QVBoxLayout()
        self.browser = self.browser = QWebEngineView()
        self.layout.addWidget(self.browser)
        self.setLayout(self.layout)
        self.browser.load(QUrl(r"/home/user/PyQt.html"))

        self.setWindowTitle("Local HTML")
        self.setGeometry(5, 30, 1355, 730)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()

    sys.exit(app.exec_())

四、加載並顯示嵌入的HTML代碼

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtWebEngineWidgets import *

class MainWindow(QWidget):

    def __init__(self, parent=None):
        super().__init__(parent)
        self.layout = QVBoxLayout()
        self.browser = self.browser = QWebEngineView()
        self.layout.addWidget(self.browser)
        self.setLayout(self.layout)
        self.browser.setHtml('''
                            <!DOCTYPE html>
                            <html>
                            <head>
                           <meta charset="UTF-8">
                           <title>PyQt5</title>
                            </head>
                           <body>
                              <h1>hello PyQt5</h1>
                              <h2>hello PyQt5<h2>
                           </body>
                            </html>
                            ''')

        self.setWindowTitle("Local HTML")
        self.setGeometry(5, 30, 1355, 730)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()

    sys.exit(app.exec_())

五、PyQt5調用JavaScript代碼

經過QWebEnginePage的runJavaScript(str, callable)能夠方便地實現PyQt5和HTMP/JavaScript的雙向通訊,實現了Python代碼和HTMP/JavaScript代碼的解耦,便於開發人員進行分工協做,app

from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton
from PyQt5.QtWebEngineWidgets import QWebEngineView
import sys

html = '''
      <html>
        <head>
          <title>A Demo Page</title>
          <script language="javascript">
            // Completes the full-name control and
            // shows the submit button
            function completeAndReturnName() {
              var fname = document.getElementById('fname').value;
              var lname = document.getElementById('lname').value;
              var full = fname + ' ' + lname;
              document.getElementById('fullname').value = full;
              document.getElementById('submit-btn').style.display = 'block';
              return full;
            }
          </script>
        </head>
        <body>
          <form>
            <label for="fname">First name:</label>
            <input type="text" name="fname" id="fname"></input>
            <br />
            <label for="lname">Last name:</label>
            <input type="text" name="lname" id="lname"></input>
            <br />
            <label for="fullname">Full name:</label>
            <input disabled type="text" name="fullname" id="fullname"></input>
            <br />
            <input style="display: none;" type="submit" id="submit-btn"></input>
          </form>
        </body>
      </html>
    '''

class MainWindow(QWidget):
    def __init__(self,parent=None):
        super(MainWindow, self).__init__(parent)
        self.result = None
        self.layout = QVBoxLayout()
        self.webView = QWebEngineView()
        self.webView.setHtml(html)
        self.layout.addWidget(self.webView)
        button = QPushButton('設置全名')
        self.layout.addWidget(button)
        self.setLayout(self.layout)
        self.resize(400, 200)
        self.setWindowTitle("PyQt JS")
        button.clicked.connect(self.complete_name)

    def complete_name(self):
        self.webView.page().runJavaScript('completeAndReturnName();', self.js_callback)

    def js_callback(self, result):
        self.result = result
        print(result)

if __name__ == "__main__":
    # 建立一個 application實例
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

六、JavaScript調用PyQt5代碼

JavaScript調用PyQt代碼是指PyQt能夠與加載的Web頁面進行雙向的數據交互。首先,使用QWebEngineView對象加載Web頁面後能夠得到頁面中表單輸入數據,在Web頁面中經過JavaScript代碼收集用戶提交的數據。而後,在Web頁面中,JavaScript經過橋鏈接方式傳遞數據給PyQt。PyQt接收到Web傳遞的數據,通過業務處理後,把處理事後的數據返回給Web頁面。
(1)建立QWebChannel對象
建立QWebChannel對象,註冊一個須要橋接的對象,以便Web頁面的JavaScript使用。
channel = QWebChannel()
obj = ClassName()
channel.registerObject("bridge", obj)
view.page().setWebChannel(channel)
(2)建立共享數據的PyQt對象
建立的共享對象須要繼承自QWidget或QObject。ide

from PyQt5.QtCore import QObject
from PyQt5.QtCore import pyqtProperty
from PyQt5.QtWidgets import QWidget, QMessageBox

class SharedObject(QWidget):

    def __init__(self):
        super(SharedObject, self).__init__()

    def _getStrValue(self):
        #
        return '100'

    def _setStrValue(self, str):
        # get web parameter
        print("web parameter: ", str)

    # 須要定義對外發布的方法
    strValue = pyqtProperty(str, fget=_g
```etStrValue, fset=_setStrValue)

(3)建立調用PyQt的Web頁面
在Web頁面訪問PyQt中註冊的對象,得到channel.objects.bridge共享對象,bridge是在PyQt中註冊共享對象時指定的名稱,核心代碼以下:

document.addEventListener("DOMContentLoaded", function()
{工具

new QWebChannel(qt.webChannelTransport, function(channel){
    window.bridge = channel.objects.bridge;
    alert('bridge=' + bridge + '\n從pyqt傳來的參數=' + window.bridge.strValue);
});

});ui

相關文章
相關標籤/搜索