PyQt5系列教程(13):進度對話框

上期我們學習了如何通過PyQt去構建一個自己的對話框,本期是最後一期關於對話框的內容,介紹進度對話框。

很多學友在日常處理事務的過程,由於過程漫長,需要等待一會,這時一般軟體都會給予一定的提示,例如:

當然我們做的沒這麼酷炫,是這樣的:

雖然樸素了一點,但是實用啊。

好了,先上代碼。

#coding=utf-8nnfrom PyQt5.QtWidgets import (QApplication, QWidget, QPushButton, QLabel, QLineEdit, QMessageBox, QProgressDialog)nfrom PyQt5.QtCore import Qtnimport sysnclass Example(QWidget):n def __init__(self):n super().__init__()n self.initUI()nn def initUI(self):n self.resize(300,150)n self.setWindowTitle("微信公眾號:學點編程吧--進度對話框")nn self.lb = QLabel("文件數量",self)n self.lb.move(20,40)nn self.bt1 = QPushButton(開始,self)n self.bt1.move(20,80)nn self.edit = QLineEdit(100000,self)n self.edit.move(100,40)nn self.show()nn self.bt1.clicked.connect(self.showDialog)n n def showDialog(self):n num = int(self.edit.text())n progress = QProgressDialog(self)n progress.setWindowTitle("請稍等") n progress.setLabelText("正在操作...")n progress.setCancelButtonText("取消")n progress.setMinimumDuration(5)n progress.setWindowModality(Qt.WindowModal)n progress.setRange(0,num) n for i in range(num):n progress.setValue(i) n if progress.wasCanceled():n QMessageBox.warning(self,"提示","操作失敗") n breakn else:n progress.setValue(num)n QMessageBox.information(self,"提示","操作成功")n nif __name__ == __main__:n app = QApplication(sys.argv)n ex = Example()n sys.exit(app.exec_())n

進度對話框隸屬於QProgressDialog類,QProgressDialog類提供了有關緩慢操作進度的反饋。

使用進度對話框給用戶說明操作需要花費多長時間,並表明應用程序尚未凍結。它也可以給用戶一個中止操作的機會。

進度對話的一個常見問題是很難知道何時使用它們;操作在不同的硬體上花費的時間不同。QProgressDialog提供了一個解決這個問題的方法:它估計操作所花費的時間(基於步驟的時間),並且只有當該估計值超出minimumDuration() (默認為4秒)時才顯示。

使用setMinimum() 和setMaximum() 或構造函數來設置操作中的「steps」數量,並在操作進行時調用setValue()。步數可任意選擇。它可以是複製的文件數,接收到的位元組數,迭代次數,或其他合適的單位。進度從setMinimum()設置的值開始,進度對話框顯示當您使用setMaximum()設置的值作為參數調用setValue() 時,操作已完成。

對話框自動在操作結束時重置並隱藏自身。使用setAutoReset()和setAutoClose()來更改此行為。請注意,如果設置新的最大值(使用setMaximum()或setRange() )等於當前value(),對話框將不會關閉。

使用QProgressDialog有兩種方式:模態和非模態。

與非模態的QProgressDialog相比,模態的QProgressDialog更容易用於程序員。循環執行操作,間隔調用setValue(),並使用wasCanceled()檢查取消。像我們上面的例子就是這種。

非模態進度對話框由於涉及到其它幾個知識點,這裡暫不做介紹。後面我會和其它幾個知識點一起談。

progress = QProgressDialog(self)nprogress.setWindowTitle("請稍等") nprogress.setLabelText("正在操作...")nprogress.setCancelButtonText("取消")nprogress.setMinimumDuration(5)nprogress.setWindowModality(Qt.WindowModal)nprogress.setRange(0,num)n

我們新建了一個QProgressDialog對象progress,設置它的標題、標籤、增加取消的按鈕。

界面

progress.setMinimumDuration(5)n

此屬性保留對話框出現之前必須通過的時間。

如果任務的預期持續時間小於minimumDuration,則對話框根本不會出現。這樣可以防止彈出對話框,快速完成任務。對於預期超過minimumDuration的任務,對話框將在minimumDuration時間之後或任何進度設置後立即彈出。如果設置為0,則只要設置任何進度,將始終顯示對話框。 默認值為4000毫秒,即4秒。

progress.setWindowModality(Qt.WindowModal)n

此屬性保留由模態小部件阻止的窗口。

這個屬性只對Windows有意義。 模態小部件防止其他窗口中的小部件獲取輸入。 該屬性的值控制在窗口小部件可見時阻止哪些窗口。 窗口可見時更改此屬性無效; 您必須首先hide()小部件,然後再次show()。

默認情況下,此屬性為Qt.NonModal。其它屬性如下:

progress.setRange(0,num)n

由上面我們知道:使用setMinimum() 和setMaximum() 或構造函數來設置操作中的「steps」數量,並在操作進行時調用setValue()。setRange(0,num)就是設置其最小和最大值,這裡最小值0,最大值num,num是根據輸入框中的數字確定的。

for i in range(num):n progress.setValue(i)n if progress.wasCanceled():n QMessageBox.warning(self,"提示","操作失敗")n breaknelse:n progress.setValue(num)n QMessageBox.information(self,"提示","操作成功")n

setValue()該屬性持有當前的進度。要使進度對話框按預期的方式工作,您應該首先將此屬性設置為QProgressDialog的最大最小值, 您可以在中間調用setValue()任意次數。

通過wasCanceled()判斷我們是否按下取消按鈕,如果按下則提示失敗。若for循環順利結束,執行else後的語句,表明成功。

ok,今天對話框的介紹暫時就到這裡吧。

如果你想要本次教程中的相關源碼,請關注微信公眾號:學點編程吧,發送pyqt513,會自動得到相應的百度網盤下載鏈接。


推薦閱讀:

Python網路爬蟲(二)- urllib爬蟲案例
Python入門到精通視頻課程(5)
【視頻】字元串,今天你學習了嗎
學習筆記三:改善Python程序的91個建議

TAG:Python | Python教程 | PyQt |