PyQt5 初體驗

墮落小生發表於2020-05-06

PyQt5 初體驗

經常使用 python 編寫一些小工具用具輔助日常工作,平時編寫的都是命令列小工具,雖然看起來高大上,但是用起來著實有點不方便,於是就想著給自己編寫的小工具加上一個UI

於是就有了這次PyQt5初體驗。

環境搭建很簡單
python3.6
PyCharm 2020.1 (Community Edition)
PyQt5
pyqt5-tools

視窗未響應

遇到的第一個問題,是在執行程式的時候,視窗會出現未響應的情況,
原來是因為我所有的程式都是在一個執行緒裡面執行的,當某個函式執行時間太長的時候,視窗就會出現未響應的現象。
解決方法:
為函式建立自己的執行緒。 所以我第一次接觸執行緒程式設計,這就有了第二個問題,不同的執行緒之間怎麼傳遞資料。

建立執行緒

from PyQt5.QtCore import QThread, pyqtSignal  # 匯入執行緒需要的庫

class myThread(QThread):  # 定義執行緒物件

    _signal = pyqtSignal(str)   # 定義執行緒訊號

    def __init__(self, parameter1, parameter2):  # 執行緒初始化
        self.parameter = parameter1
        pass
    def run(self): # 執行緒要執行的操作
        self._signal.emit(self.parameter) # 發射訊號, 引數要和訊號定義中的型別,數量一致

看資料說,直接改寫執行緒的 run 方法是不被 PyQt 官方推薦的,應該使用 moveToThread 方法,以後在研究。

執行緒間資料傳遞

方法一,使用全域性變數,不同執行緒直接操作全域性變數,簡單,方便。但是這樣的話不利於程式模組化,程式複用性會大大降低,有一個詞是 不夠 Pythonic。
方法二,使用訊號,將需要傳遞的資料通過訊號傳送出來就可以了,同樣很方便,使用起來也更靈活。

視窗間資料傳遞

這個問題,同樣用訊號解決了。

關於 tableWidget

要是你新增完資料發現表格沒有顯示,那可能是因為你沒有設定表格的行和列,像這樣:

from PyQt5.QtWidgets import QTableWidget, QAbstractItemView  
tableWidget = QTableWidget()  
tableWidget.setRowCount(5)  
tableWidget.setColumnCount(9)  
tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)  

urllib.request.urlopen 耗時

有時候這個請求會耗費大量的時間,不知道是伺服器的原因,還是程式本身的原因

enter image description here enter image description here

pyinstaller打包

遇到的問題: 在 XP 系統執行時,提示 無法定位程式輸入點於 KERNEL32.dll

原因: Python 支援 XP 的最後一個版本是 Python3.4,若果用更高版本的 Python 打包程式,就可能出現這個問題。

解決辦法: 更換 Python 版本到 3.4

遇到問題: Python3.4 中無法使用 pip 安裝 PyQt5

原因: 提示說找不到指定版本的 sip

解決辦法: 使用 exe 安裝包安裝,只能安裝到 Python 安裝目錄,無法使用虛擬環境

一開始我使用 Python 3.6 + PyQt5 打包後在 Win7 上 和 Win 10 上可以用,在 XP 上執行程式,卻提示 無法定位程式輸入點於 KERNEL32.dll

幾經波折擦發現,是因為 Python 支援 XP 的最後一個版本是 Python 3.4,切換到 Python 3.4 以後,又發現沒有辦法使用 pip 安裝 PyQt5,然後找到了 PyQt5 的 exe 安裝包,但是這個安裝到 venv 虛擬環境資料夾有不能別正確識別,只能安裝到 Python 安裝目錄才行。

OK!!! 到這裡,折騰成功。

python 3.4 已經接受生命週期, XP 也已經不再維護,說以如果可以,還是不要在折騰相容 XP 的程式了。