PyQt5 初體驗
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 耗時
有時候這個請求會耗費大量的時間,不知道是伺服器的原因,還是程式本身的原因
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 的程式了。
相關文章
- Angular 初體驗Angular
- http初體驗HTTP
- AQS初體驗AQS
- golang 初體驗Golang
- OpenCV 初體驗OpenCV
- Nuxt 初體驗UX
- indexedDB 初體驗Index
- laravel初體驗Laravel
- Flutter初體驗Flutter
- jQuery初體驗jQuery
- ollama 初體驗
- Electron初體驗
- go modules 初體驗Go
- ReactNative初體驗React
- react hooks初體驗ReactHook
- Laravel Octane 初體驗Laravel
- gRPC初體驗RPC
- Mybatis初體驗(二)MyBatis
- Vue 初體驗(上)Vue
- Canvas 動畫初體驗Canvas動畫
- html初體驗#2HTML
- Docker容器初體驗Docker
- Docker for Mac 初體驗DockerMac
- Docker 容器初體驗Docker
- 表分析初體驗
- .Net Aspire初體驗
- SpringMVC初體驗SpringMVC
- web assembly 初體驗Web
- Argo CD初體驗Go
- 微服務新體驗之Aspire初體驗微服務
- golang 與 docker 初體驗GolangDocker
- Python初體驗——列表Python
- Vue.js初體驗Vue.js
- React Native 初體驗React Native
- Go初體驗|基礎Go
- Github codespaces 初體驗Github
- 微軟YARP初體驗微軟
- VUE 3.0 初體驗之路Vue