PyInstaller是一款免費易用的打包工具,支持Windows、Linux、MacOS,而且支持32位和64位系統。
http://www.pyinstaller.org/
PyInstaller安裝:pip install pyinstaller
javascript
PyInstaller使用命令以下:pyinstaller yourprogram.py
PyInstaller使用時需切換至xxx.py文件所在目錄下。
經常使用可選項以下:
-F:打包後只生成單個可執行文件
-D:默認選項,建立一個目錄,包含可執行文件以及大量依賴文件
-c:默認選項,使用控制檯
-w:不使用控制檯
-p:添加搜索路徑,讓其找到對應的庫
-i:改變生成程序的icon圖標。html
PyInstaller將Python解釋器和Python腳本打包成一個可執行文件,並無編譯爲機器碼。PyInstaller打包的可執行文件不會提升運行效率,並且可能會下降運行效率。打包的優點是在運行機器上不用安裝Python和Python腳本所依賴的庫。在Linux系統下,PyInstaller主要使用binutil工具包中的ldd和objdump命令。
PyInstaller會分析指定的Python腳本所依賴的其它依賴,而後進行查找和複製,把全部的依賴都收集起來並進行加密處理,包括Python解釋器,最後將文件打包到一個目錄或打包到可執行文件中。
使用PyInstaller打包生成的可執行文件,只能在和打包機器相同的環境下運行,若是要在不一樣的操做系統上運行,必須在新的操做系統環境上從新打包。java
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
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_())
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_())
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_())
經過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調用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