基于PyQT6從零開(kāi)始做一個(gè)計(jì)時(shí)器
初步
QT是最流行的跨平臺(tái)GUI,基于C++開(kāi)發(fā),pyQT為其python綁定,兼顧了開(kāi)發(fā)效率和運(yùn)行效率,是Python語(yǔ)言首選GUI框架,支持pip安裝
pip install PyQt6
考慮到本系列的主角是PyQT,故后文中如不做特殊說(shuō)明,QT一律指代PyQT。一個(gè)最簡(jiǎn)單的QT界面如下圖所示

代碼如下
import PyQt6.QtWidgets as qt
app = qt.QApplication([])
win = qt.QDialog()
win.resize(400,150)
hbox = qt.QHBoxLayout()
btn = qt.QPushButton("點(diǎn)我")
btn.clicked.connect(lambda: qt.QMessageBox.information(
win, "Msg", "你點(diǎn)了我"))
hbox.addWidget(btn)
win.setLayout(hbox)
win.show()
從上述代碼可以看到,qt中的函數(shù)均以Q開(kāi)頭,然后緊接著是駝峰命名。這種命名規(guī)則可以有效避開(kāi)其他Python模塊,所以實(shí)際開(kāi)發(fā)時(shí),可直接導(dǎo)入QT組件,后面就不用寫(xiě)qt.xx了。
【QApplication】用于創(chuàng)建一個(gè)QT應(yīng)用,是所有QT代碼能夠被執(zhí)行的前提。盡管看上去什么也沒(méi)做,但必須將其賦給一個(gè)變量,以確保其能夠在整個(gè)GUI生命周期中保持存活。
有了QApp之后,就可以添加布局元素了,包括
- 【QDialog】對(duì)話框,也就是我們看到的窗口,通過(guò)
resize方法,可以設(shè)置窗口的尺寸;setLayout可以添加布局好的內(nèi)容;show則可彈出窗口。 - 【QHBoxLayout】水平布局管理器,通過(guò)
addWidget方法,可以添加控件。 - 【QPushButton】按鈕,通過(guò)
clicked.connect來(lái)綁定回調(diào)函數(shù) - 【QMessageBox】中提供了許多消息框,
information為信息框
在實(shí)際開(kāi)發(fā)時(shí),往往將窗口寫(xiě)成類(lèi),并通過(guò)腳本的形式調(diào)用,示例如下
import PyQt6.QtWidgets as qt
import sys
class QT1:
def __init__(self):
app = qt.QApplication([])
self.win = qt.QDialog()
self.win.resize(400,150)
hbox = qt.QHBoxLayout()
btn = qt.QPushButton("點(diǎn)我")
btn.clicked.connect(self.show_msg)
hbox.addWidget(btn)
self.win.setLayout(hbox)
self.win.show()
sys.exit(app.exec())
def show_msg(self):
qt.QMessageBox.information(self.win, "信息提示", "你點(diǎn)擊了我")
if __name__ == "__main__":
QT1()
和交互式命令行相比,腳本運(yùn)行QT程序需要在show之后,添加【app.exec()】,以阻塞程序,否則程序會(huì)閃退。
導(dǎo)出ui表單
QT提供了非常便捷的拖動(dòng)式開(kāi)發(fā)工具,只需安裝pyside6即可啟動(dòng)。
pip install pyside6 pyside6-designer
進(jìn)入設(shè)計(jì)器后,在模板欄選擇Main Window,點(diǎn)擊創(chuàng)建,即可進(jìn)入U(xiǎn)I拖拽界面

對(duì)于這個(gè)界面,常年使用C++的同學(xué)肯定會(huì)感到十分親切。Ctrl+S快捷鍵可以保存當(dāng)前項(xiàng)目,其格式為.ui。這個(gè).ui文件是QT的界面表單,對(duì)于C++或者Python都是通用的。
下面設(shè)計(jì)一個(gè)計(jì)時(shí)器,即從左側(cè)的部件盒子中,拉取一個(gè)LCD Number到界面上,用于計(jì)時(shí);再拉取兩個(gè)Push Button作為控制按鈕。雙擊Push Button可以更改按鈕上顯示的文字,兩個(gè)按鈕分別設(shè)為開(kāi)始和停止。
右側(cè)屬性欄中,可以修改部件名稱(chēng),LCD數(shù)字屏保留原始的lcdNumber即可;開(kāi)始和停止按鈕分別設(shè)為bnStart和bnStop。
調(diào)用
QT設(shè)計(jì)器的功能僅限于畫(huà)界面,在導(dǎo)出.ui之后,剩下的工作還是要交給Python。
剛剛我們保存的界面文件名為main.ui,下面在其同級(jí)路徑下創(chuàng)建python腳本如下
from PyQt6 import uic
from PyQt6.QtWidgets import QApplication, QMainWindow
import sys
class MyWindow(QMainWindow):
def __init__(self):
super().__init__()
uic.loadUi('main.ui', self) # 加載UI文件
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec())
運(yùn)行這個(gè)腳本,即可展現(xiàn).ui中的規(guī)劃成果

計(jì)時(shí)器實(shí)現(xiàn)
關(guān)于計(jì)時(shí)器的具體實(shí)現(xiàn)流程,主要就是Python的工作了,其運(yùn)行結(jié)果如下

代碼如下
import time
from threading import Thread
class MyWindow(QMainWindow):
def __init__(self):
super().__init__()
uic.loadUi('main.ui', self) # 加載UI文件
self.bnStart.clicked.connect(self.bnStart_click)
self.bnStop.clicked.connect(self.bnStop_click)
def timer(self):
t0 = time.time()
while self.isRunning:
dt = time.time() - t0
self.lcdNumber.display(f"{dt:.3f}")
time.sleep(0.1)
def bnStart_click(self):
self.isRunning = True
self.lcdNumber.display("0")
Thread(target = self.timer, daemon=True).start()
def bnStop_click(self):
if self.isRunning:
self.isRunning = False
else:
self.lcdNumber.display("0")
【click】為按鈕的點(diǎn)擊動(dòng)作,在QT的對(duì)象體系中,是一種信號(hào),是【pyqtBoundSignal】類(lèi)的具體實(shí)現(xiàn),而非某個(gè)某種函數(shù)。
【connect】即用于將按鈕的點(diǎn)擊信號(hào)綁定到某個(gè)執(zhí)行函數(shù)上。
在QT的術(shù)語(yǔ)中,connect綁定的執(zhí)行函數(shù)叫做槽(slot),只不過(guò)在pyqt中,不知道slot這個(gè)概念也沒(méi)什么問(wèn)題。
到此這篇關(guān)于基于PyQT6從零開(kāi)始做一個(gè)計(jì)時(shí)器的文章就介紹到這了,更多相關(guān)PyQT6計(jì)時(shí)器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決Keras中循環(huán)使用K.ctc_decode內(nèi)存不釋放的問(wèn)題
這篇文章主要介紹了解決Keras中循環(huán)使用K.ctc_decode內(nèi)存不釋放的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06
使用Python開(kāi)發(fā)視頻格式轉(zhuǎn)換工具
這篇文章主要介紹了如何使用Python開(kāi)發(fā)一個(gè)帶圖形界面的視頻格式轉(zhuǎn)換工具,可以將WMV格式的視頻轉(zhuǎn)換為手機(jī)可以播放的MP4格式,需要的可以參考下2024-12-12
python paramiko利用sftp上傳目錄到遠(yuǎn)程的實(shí)例
今天小編就為大家分享一篇python paramiko利用sftp上傳目錄到遠(yuǎn)程的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
Django自帶用戶(hù)認(rèn)證系統(tǒng)使用方法解析
這篇文章主要介紹了Django自帶用戶(hù)認(rèn)證系統(tǒng)使用方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
C站最全Python標(biāo)準(zhǔn)庫(kù)總結(jié),你想要的都在這里
這篇文章主要介紹了C站最全的Python標(biāo)準(zhǔn)庫(kù),總共包含10個(gè)類(lèi)型,希望能對(duì)大家有幫助,看完不虧系列2021-07-07
Python實(shí)戰(zhàn)之手勢(shì)識(shí)別控制電腦音量
這篇文章主要為大家詳細(xì)介紹了一個(gè)Python OpenCV的實(shí)戰(zhàn)小項(xiàng)目——手勢(shì)識(shí)別控制電腦音量,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-05-05
簡(jiǎn)單談?wù)刾ython中的語(yǔ)句和語(yǔ)法
下面小編就為大家?guī)?lái)一篇簡(jiǎn)單談?wù)刾ython中的語(yǔ)句和語(yǔ)法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08
C++通過(guò)內(nèi)嵌解釋器調(diào)用Python及間接調(diào)用Python三方庫(kù)
本文主要介紹了C++通過(guò)內(nèi)嵌解釋器調(diào)用Python及間接調(diào)用Python三方庫(kù),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
Python結(jié)合SpeechRecognition和gTTS庫(kù)打造智能語(yǔ)音備忘錄
這篇文章主要為大家詳細(xì)介紹了如何利用Python的SpeechRecognition和gTTS庫(kù),打造一款集語(yǔ)音輸入,自動(dòng)轉(zhuǎn)文字,朗讀保存于一體的智能語(yǔ)音備忘錄工具,感興趣的小伙伴可以了解下2025-04-04
Python+Tkinter實(shí)現(xiàn)經(jīng)典井字棋小游戲
Tkinter是內(nèi)置到Python安裝包中的,只要安裝好Python之后就能import?Tkinter,而且IDLE也是用Tkinter編寫(xiě)而成的。本文將用Tkinter編寫(xiě)經(jīng)典的井字棋小游戲,需要的可以參考一下2022-03-03

