本篇不講什么畫UI的代碼心得...本來我也不喜歡畫ui
也不扯信號與槽那些概念芋类,反正就是講一下快速上手的方法,如何快速實現(xiàn)想要的功能位喂。
反正正統(tǒng)畫UI教程一搜一大堆疗垛,比如這里講的很詳細(xì)了。
不得不說宾肺,pyQt
比C++
的Qt
簡單好多...
首先安裝溯饵,只需要pip install pyqt5
就好,不需要去官網(wǎng)下載什么東西锨用。
不過這樣安裝完看上面鏈接教程開始寫代碼的話丰刊,就是走困難模式了。
畫UI最方便當(dāng)然是用控件拖來拖去增拥,用代碼多麻煩累死人啄巧。
所以暫時不要管上面的鏈接教程,接下來還需要用pip install pyqt5-tools
下好qtdesigner
掌栅,打開進(jìn)行拖控件的畫UI過程秩仆。
不要問在哪里,在下好的包文件夾里...找不到就從import pyQt5
的源碼里跳轉(zhuǎn)打開pyqt5
的文件夾去再往前找pyqt5-tools
文件夾進(jìn)去就有這個exe了渣玲,什么你用的notepad++
不支持跳轉(zhuǎn)趕緊換vscode或者重量級的pycharm吧逗概。
不過這個軟件好像是英文的哎,雖然網(wǎng)上有的是中文可能是另下的...要有起碼的英文水平忘衍,也不難實在不行就對著查單詞逾苫。
像什么這個軟件似乎做不出來的圖標(biāo)和浮動提示框在上面的教程有可以在后期用代碼補一下。
畫完左上角保存到桌面或者其他地方后枚钓,在那個目錄只需要pyuic5 -x untitled.ui -o test.py
就可以生成能直接運行的代碼了铅搓。不加-x
的話要改成pyuic5 -o test.py untitled.ui
,不過這樣的話還不能直接運行搀捷,要在下面加好幾行代碼:
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
但是用第一條命令的話星掰,這些代碼是自動補上的多望,所以更方便。
下面總結(jié)一下用到的幾個控件氢烘,注意要對Python
的類與對象有一定了解怀偷。
輸入框(textEdit)
一般拿來輸入當(dāng)作input
用。也可以用來顯示播玖,編輯椎工,再保存。
顯示的方法是在當(dāng)前代碼類中定義一個函數(shù)
def setTextEdit(self, category: str):
self.textEdit.setText('...<b>測試</b>.......(pyQt的所有顯示文字都可以用html語法)')
括號里可以是功能函數(shù)的返回值蜀踏,于是就輸出到界面上了维蒙。其實連接邏輯實現(xiàn)函數(shù)就有信號與槽的概念了...從實際功能轉(zhuǎn)到為它取1個名字比較容易接受。
按鈕(pushButton)
點擊觸發(fā)其他函數(shù)運行
self.pushButton.clicked.connect()
括號里是要運行的類內(nèi)函數(shù)的名字果覆,就像用多線程threading
等模塊一樣颅痊,不需要帶括號。如果那個函數(shù)不止self一個參數(shù)局待,就用lambda表達(dá)式然后是完整的函數(shù)帶括號帶參數(shù)斑响,當(dāng)然還有別的方法,不過lambda表達(dá)式比較直觀
self.pushButton.clicked.connect(lambda: self.reloadTextEdit(args1, args2, ...))
文本瀏覽框(textBrowser)
用來顯示文本燎猛,不可編輯恋捆。
不清空的顯示用的比較多照皆,實際上是一個列表持續(xù)append
每行數(shù)據(jù)重绷。也就是說這個列表元素必須是str
類型。
import xxx # 當(dāng)前目錄下的其他.py文件膜毁,提供邏輯功能實現(xiàn)
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
pass # 這里就省略了
def func(self):
for i in xxx.afunc(self.textEdit.toPlainText()):
self.textBrowser.append(i)
這個func()
一般就是上面pushButton
的連接函數(shù)之一了昭卓。
self.textEdit.toPlainText()
相當(dāng)于input()
。
很多時候其實輸入.
之后等ide彈出相關(guān)的方法瘟滨,直接輸text
看看還剩下啥就猜得到需要用啥方法了候醒。當(dāng)然ide一定要有這個功能,雖然我用的vscode還不算ide,嘛vs2017和pycharm也都可以做到杂瘸。
下拉框(comboBox)
可以直接在初始化時添加一系列元素倒淫,使用self.comboBox.additem()
方法,括號內(nèi)是要添加的元素败玉,或者用self.comboBox.additems()
方法敌土,括號內(nèi)可以是一個列表,所有列表內(nèi)的元素都變成下拉選項之一运翼。
每次選定下拉元素后返干,當(dāng)前選項是self.comboBox.currentText()
使用self.comboBox.activated.connect()
來激活選項。
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
self.comboBox = QtWidgets.QComboBox(self.centralwidget)
self.comboBox.setGeometry(QtCore.QRect(700, 180, 240, 30))
self.comboBox.setObjectName("comboBox")
self.comboBox.addItems(...) # 里面是一個list
self.comboBox.activated.connect(lambda: self.setTextEdit(self.currentCategory()))
pass # 這里就省略了
def currentCategory(self):
return self.comboBox.currentText()
def setTextEdit(self, category: str):
self.textEdit.setText('...')
圖標(biāo)
上面鏈接里入門教程就有圖標(biāo)和懸浮提示血淌,后者沒啥問題就不寫了矩欠,前者如果不熟悉類的話可能一下子寫不對。
def retranslateUi(self, MainWindow):
pass
MainWindow.setWindowIcon(QtGui.QIcon('icon.png'))
pass
其實大致上的代碼是在最下面的retranslateUi
函數(shù)(這是ui轉(zhuǎn)化成代碼時自動生成的函數(shù))里加一行就行,icon.png
是放在當(dāng)前目錄下的圖片文件名癌淮。打包后的話要和exe文件放在一個文件夾躺坟。
暫時就用到以上這些,像是label
這樣超級基礎(chǔ)的玩意就算了不寫了乳蓄。
最后瞳氓,用pyinstaller
打包的話,直接打包由于不認(rèn)識pyqt
的動態(tài)鏈接庫會有一些錯誤栓袖,應(yīng)該這樣
pyinstaller --paths C:\Users\...\AppData\Local\Programs\Python\Python36\Lib\site-packages\PyQt5\Qt\bin -F -w test.py xxx.py
paths
后面的路徑是自己電腦里pyqt
的bin
文件夾位置匣摘,一般默認(rèn)只要把上面的省略號換成自己用戶名就好了。
多個文件打包只需要空格分開就好裹刮。
-F
加上后會只生成一個exe文件音榜,否則會生成很多其他文件。
-w
加上后運行程序不會出現(xiàn)命令行背景捧弃。也就是說看不到如果崩潰時的錯誤信息赠叼,只是給用戶用的。
好了违霞,以上代碼雖然足夠隨便寫一個軟件出來...
但是有兩個嚴(yán)重問題:
- 邏輯實現(xiàn)和UI實現(xiàn)代碼沒有分開在不同線程工作嘴办,如果邏輯實現(xiàn)運行比較久的話程序就卡住了。再鼠標(biāo)點擊下可能就崩潰了买鸽。
- 直接依靠拖動定位的話涧郊,在不同分辨率上的顯示效果不一樣,可能錯位或者部分顯示被吃了眼五,以及拉伸界面不會自動空間跟著過去妆艘。
哎反正我只有三天時間強行做出來的這么一個東西,一開始完全一臉懵比狀態(tài)啥也不知道看幼,就暫時不要要求太高了批旺。
而且客戶端時代早已過去,web才是未來诵姜。