本文旨在通過一個簡單的demo,介紹基于Python3、PyQT5的環境下開發桌面應用程式的一種方案,當然開發Python的桌面應用程式不止是PyQT 這一種方案,還可以使用Python自帶的Tkinter 來實作。
本文目錄:
- 1. 安裝依賴環境
- 2. 安裝Eric6
- 3. 配置Eric
- 4. 建立視窗應用
- 4.1 建立窗體UI
- 4.2 實作代碼邏輯
- 5. 打包py腳本輸出exe
- 5.1 安裝pyinstaller
- 5.2 打包輸出exe程式
- 參考資料:
1. 安裝依賴環境
Eric6官網:http://eric-ide.python-projects.org/
Eric6 依賴的元件必須先安裝好,依賴元件清單如下:
依賴:
為了使用 eric6 你應該預先安裝好下列元件:
- Python 3.4.0 or better
- Python 2.7.10 or better
- Qt 5.3.0 or better (from The Qt Company)
- Qt 4.8.0 or better (from The Qt Company)
- PyQt 5.3.0 or better (from Riverbank)
- PyQt 4.10.0 or better (from Riverbank)
- QScintilla 2.8.0 or better (from Riverbank)
元件太多,并且他們之間的依賴關系一言不合就出錯,這裡介紹個比較好的內建環境 Anaconda3 (64-bit) ,用它來安裝Pyqt等可以比較省心。
我本機的環境是:
- Win7 64位
- Anaconda 3-5.2.0-Windows-x86_64
- Python 3.6.5
- pip 10.0.1
- Eric6 18.10
- Pyqt 5.9.2
- QScintilla
- PyInstaller 3.5.dev0
其中
QScintilla
是通過指令
pip3 install QScintilla
安裝的。
2. 安裝Eric6
依賴環境都搞定後,下載下傳Eric6:
Eric6穩定版官方下載下傳位址:Eric6-18 :點我去下載下傳

由于18.0版本開始沒有了漢化包(或者是現在到了18.10版本都還沒有出來?),我們可以用17.12裡面的中文包來達到漢化的目标。
Eric6-17.12:點我去下載下傳
下載下傳後,把18.10的主程式zip包解壓,然後把17.12這個中文語言包解壓,覆寫到18.10目錄,然後在cmd進入這個18.10主程式包解壓目錄,執行下面的指令安裝:
pyton install.py
安裝完成後啟動,輕按兩下
eric6.cmd
檔案啟動(我的因為是安裝了Anaconda3,是以這個cmd檔案所在路徑為:
C:ProgramDataAnaconda3Scripts
),如果界面是中文的表示前面的漢化操作成功。
這裡有個小問題,輕按兩下這個批處理啟動的時候,會一閃而過一個黑色的cmd視窗,不能忍,用一個簡單的方法搞定… ,給這個檔案建立個快捷方式發送到桌面,然後在這個快捷方式上右鍵屬性,在
運作方式
那裡把【
正常視窗
】改為 最小化:
然後點應用-确定,下次輕按兩下啟動就妥妥的看不到一閃而過的憂傷了…
3. 配置Eric
啟動eric6後,界面如下,可以看到中文漢化成功:
首次啟動,會自動彈出對配置對話框提示讓你配置資訊,如果你錯過了也沒關系,從Eric6的應用程式界面菜單
[設定-首選項]
進入,具體配置如下:
從菜單的存儲庫進入,安裝
插件-插件
插件:
jedi
![]()
Python3的桌面程式開發利器:Eric6的環境搭建、使用
最後配置一下預設工作目錄:![]()
Python3的桌面程式開發利器:Eric6的環境搭建、使用
4. 建立視窗應用
4.1 建立窗體UI
然後項目檔案夾多了以下内容:
回到Eric6界面,左側的源碼Tab頁簽切換到GUI窗體頁簽,右鍵選擇 建立窗體
:
然後會引導你選擇位置儲存這個窗體檔案,然後會自動進入QT Designer設計界面:
這個界面,就跟MFC的設計界面差不多,哈哈,左側滑鼠按住按鈕控件不放,拖動至中間的窗體中,然後輕按兩下這個控件,輸入名字:
Push Button
,再添加一個text文本控件,然後設定窗體名字:
測試按鈕
![]()
Python3的桌面程式開發利器:Eric6的環境搭建、使用
4.2 實作代碼邏輯
在前面設計好ui界面後,儲存代碼并關閉QT Designer視窗回到Eric6界面
然後在左側ui檔案上右鍵選擇生成ui界面元件對應的python代碼:
編譯窗體
這時會在項目目錄生成一個Ui_Test.py 腳本檔案,内容如下:![]()
Python3的桌面程式開發利器:Eric6的環境搭建、使用
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'D:andyReperic6Test.ui'
#
# Created by: PyQt5 UI code generator 5.11.3
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_dialog(object):
def setupUi(self, dialog):
dialog.setObjectName("dialog")
dialog.resize(400, 343)
dialog.setSizeGripEnabled(True)
# 定義的按鈕
self.pushButton = QtWidgets.QPushButton(dialog)
self.pushButton.setGeometry(QtCore.QRect(130, 120, 75, 23))
self.pushButton.setObjectName("pushButton")
# 定義的文本
self.plainTextEdit = QtWidgets.QPlainTextEdit(dialog)
self.plainTextEdit.setGeometry(QtCore.QRect(110, 170, 181, 31))
self.plainTextEdit.setObjectName("plainTextEdit")
self.retranslateUi(dialog)
QtCore.QMetaObject.connectSlotsByName(dialog)
def retranslateUi(self, dialog):
_translate = QtCore.QCoreApplication.translate
dialog.setWindowTitle(_translate("dialog", "測試應用名"))
self.pushButton.setText(_translate("dialog", "測試按鈕"))
self.plainTextEdit.setPlainText(_translate("dialog", "點選按鈕,改變此處文本"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
dialog = QtWidgets.QDialog()
ui = Ui_dialog()
ui.setupUi(dialog)
dialog.show()
sys.exit(app.exec_())
裡面可以看到我們在窗體界面定義的兩個控件:按鈕、文本顯示的對應python類中的變量名為:
pushButton
、
plainTextEdit
接着在左側窗體視圖的UI檔案上右鍵選擇生成對話框代碼:![]()
Python3的桌面程式開發利器:Eric6的環境搭建、使用
選擇對話框上兩個控件所需的響應事件後儲存:![]()
Python3的桌面程式開發利器:Eric6的環境搭建、使用
然後切換到python源碼頁簽可以看到生成了一個py類檔案,裡面自動生成了剛才在對話框中選擇的兩個響應事件的代碼邏輯:
# -*- coding: utf-8 -*-
"""
Module implementing dialog.
"""
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QDialog
from .Ui_Test import Ui_dialog
class dialog(QDialog, Ui_dialog):
"""
Class documentation goes here.
"""
def __init__(self, parent=None):
"""
Constructor
@param parent reference to the parent widget
@type QWidget
"""
super(dialog, self).__init__(parent)
self.setupUi(self)
@pyqtSlot()
def on_pushButton_clicked(self):
"""
Slot documentation goes here.
"""
# TODO: not implemented yet
raise NotImplementedError
@pyqtSlot()
def on_plainTextEdit_textChanged(self):
"""
Slot documentation goes here.
"""
# TODO: not implemented yet
raise NotImplementedError
我們修改下這個類:
- 加上main方法
- 修正引用的ui資源路徑:把這裡的
那個點.去掉,否則會提示找不到這個子產品from .Ui_Test import Ui_dialog
- 修改按鈕響應函數,改變文本控件顯示的内容
- 修改文本内容改變響應函數,彈出一個消息提示框
修改完成的内容如下:
# -*- coding: utf-8 -*-
"""
Module implementing dialog.
"""
import sys
#這裡我們提供必要的引用。基本控件位于pyqt5.qtwidgets子產品中。
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QDialog, QMessageBox
from Ui_Test import Ui_dialog
class dialog(QDialog, Ui_dialog):
"""
Class documentation goes here.
"""
def __init__(self, parent=None):
"""
Constructor
@param parent reference to the parent widget
@type QWidget
"""
super(dialog, self).__init__(parent)
self.setupUi(self)
@pyqtSlot()
def on_pushButton_clicked(self):
"""
Slot documentation goes here.
"""
# 按鈕按下,改變label标簽的文本内容
self.plainTextEdit.setPlainText(u"按鈕觸發,我改變了自己!")
@pyqtSlot()
def on_plainTextEdit_textChanged(self):
"""
Slot documentation goes here.
"""
# TODO: not implemented yet
reply = QMessageBox.question(self, '資訊', '文本框内容改變了',QMessageBox.Yes)
if __name__ == '__main__':
#每一pyqt5應用程式必須建立一個應用程式對象。sys.argv參數是一個清單,從指令行輸入參數。
app = QApplication(sys.argv)
#QWidget部件是pyqt5所有使用者界面對象的基類。他為QWidget提供預設構造函數。預設構造函數沒有父類。
dialog = dialog()
#resize()方法調整視窗的大小。這離是400px寬248px高
dialog.resize(400, 248)
#設定視窗的标題
dialog.setWindowTitle('我修改了标題')
#顯示在螢幕上
dialog.show()
#系統exit()方法確定應用程式幹淨的退出
#的exec_()方法有下劃線。因為執行是一個Python關鍵詞。是以,exec_()代替
sys.exit(app.exec_())
然後點選Eric6應用的菜單:,配置主腳本為我們這個
項目-屬性
:
Test.py
![]()
Python3的桌面程式開發利器:Eric6的環境搭建、使用
最後,通過菜單或者快捷鍵Ctrl+F2啟動我們這個對話框應用:![]()
Python3的桌面程式開發利器:Eric6的環境搭建、使用
點選按鈕後:
5. 打包py腳本輸出exe
5.1 安裝pyinstaller
下載下傳pyinstaller源碼,源碼github位址,有時候用git拉取下來網速很慢,這裡可以從csdn下載下傳我上傳的最新版本(20181026更新的):點我下載下傳20181026版本源碼
然後解壓這個源碼到某個目錄,cmd進入這個解壓目錄,通過以下指令安裝:
python setup.py install
![]()
Python3的桌面程式開發利器:Eric6的環境搭建、使用
5.2 打包輸出exe程式
然後來到我們的.py源碼目錄,通過以下指令打包成exe檔案:
pyinstaller -F -w -i "D:\xxxxxx\app.ico" Test.py
基礎的指令格式是 pyinstaller [opts] [目标程式.py]
可選的opts有:
-F, –onefile 打包成一個exe檔案。
-D, –onedir 建立一個目錄,包含exe檔案,但會依賴很多檔案(預設選項)。
-c, –console, –nowindowed 使用控制台,無界面(預設)
-w, –windowed, –noconsole 使用視窗,無控制台
-i "D:\xxxxxx\app.ico"
這個是更改exe的icon,如果不需要可以去掉。
最後打包出來的exe有35MB大小… 因為把QT核心的dll檔案打包在一起了,否則在沒有安裝python以及PyQt的電腦上無法運作的。
更多内容請檢視:pyinstaller官方說明
參考資料:
[1]: Pyqt5官方文檔
[2]: Python3官方文檔
[3]: 廖雪峰老師的Python3 線上學習手冊
[4]: 菜鳥學堂-Python3線上學習
[5]: 其他所有分享過python學習填坑網友的經驗