溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python中如何使用多線程保持GUI的響應(yīng)

發(fā)布時(shí)間:2021-10-11 17:39:50 來(lái)源:億速云 閱讀:120 作者:柒染 欄目:大數(shù)據(jù)

今天就跟大家聊聊有關(guān)Python中如何使用多線程保持GUI的響應(yīng),可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。


改善按鈕對(duì)進(jìn)度欄的控制

我們現(xiàn)在將其改進(jìn)一下:

  • 第一個(gè)按鈕用來(lái)啟動(dòng)進(jìn)度欄;

  • 第二個(gè)按鈕用來(lái)停止進(jìn)度欄;

  • 第三個(gè)按鈕用來(lái)重置進(jìn)度欄;

Python中如何使用多線程保持GUI的響應(yīng)

在之前的MainWindow類中,我們對(duì)進(jìn)度條和按鈕的事件設(shè)置三個(gè)方法:

Python中如何使用多線程保持GUI的響應(yīng)

我們將上述三個(gè)方法修改一下,改寫(xiě)成四個(gè)方法:

  • start_progressbar(self):用于啟動(dòng)進(jìn)度欄

  • stop_progressbar(self):用于停止進(jìn)度欄

  • reset_progressbar(self):用于重置進(jìn)度欄

  • update_progressbar(self):用于綁定三個(gè)按鈕到上述三個(gè)方法上


Python中如何使用多線程保持GUI的響應(yīng)

運(yùn)行程序,看看效果:

Python中如何使用多線程保持GUI的響應(yīng)

當(dāng)我們點(diǎn)擊“開(kāi)始”按鈕,進(jìn)度欄便開(kāi)始增加,當(dāng)我們點(diǎn)擊“停止按鈕”,進(jìn)度欄便停止增加,當(dāng)我們點(diǎn)擊“重置”按鈕,進(jìn)度欄便歸零。


控制進(jìn)度欄增長(zhǎng)速度


在啟動(dòng)進(jìn)度欄的start_progressbar()方法中,我們通過(guò)while循環(huán)來(lái)增加進(jìn)度欄,每次增加0.0001,在這樣的情況下,進(jìn)度欄增長(zhǎng)得很快。其實(shí),我們可以通過(guò)time模塊的sleep()方法凍結(jié)進(jìn)度欄,以達(dá)到降低進(jìn)度欄增長(zhǎng)速度的效果。

修改start_progressbar()方法如下:

Python中如何使用多線程保持GUI的響應(yīng)

我們讓進(jìn)度欄的數(shù)值增長(zhǎng)停歇0.3秒,看看效果:

Python中如何使用多線程保持GUI的響應(yīng)

進(jìn)度欄的增長(zhǎng)速度確實(shí)比之前緩慢了很多。


使用QThread線程


PyQt中QtCore的QThread對(duì)象提供了一個(gè)獨(dú)立于平臺(tái)的方式來(lái)管理線程。

QThread對(duì)象通過(guò)調(diào)用run()方法來(lái)執(zhí)行線程,默認(rèn)情況下,run()方法通過(guò)調(diào)用exec()方法來(lái)啟動(dòng)事件的循環(huán)。

下面,我們通過(guò)一個(gè)進(jìn)度欄計(jì)數(shù)器的示例,來(lái)演示一下QThread的使用。

我們新建一個(gè)繼承自QtCore.QThread的類RunThread(),并在其中定義一個(gè)run()方法用來(lái)啟動(dòng)線程,定義一個(gè)stop()方法用來(lái)停止線程。

Python中如何使用多線程保持GUI的響應(yīng)

首先,我們通過(guò)實(shí)例化QtCore.pyqtSignal(int)定義了一個(gè)新的信號(hào)counter_value,這個(gè)值會(huì)用來(lái)更新進(jìn)度欄。然后設(shè)置了RunThread()類中的一些默認(rèn)屬性。

在run()方法中,我們通過(guò)一個(gè)while循環(huán)來(lái)不斷累加計(jì)數(shù)器的值,并且將累加的計(jì)數(shù)器的值通過(guò)定義的信號(hào)counter_value發(fā)送出去。

在stop()方法中,我們?cè)O(shè)置線程的運(yùn)行狀態(tài)為Fasle,然后使用QThread的terminate()方法確保線程完全的被停止。

然后,要應(yīng)用這個(gè)進(jìn)度欄計(jì)數(shù)器,我們還需要在主窗口類MainWindow()中添加和修改一番:

添加一個(gè)進(jìn)度欄計(jì)數(shù)器方法progressbar_counter(),用來(lái)啟動(dòng)線程管理器:

Python中如何使用多線程保持GUI的響應(yīng)

添加一個(gè)進(jìn)度欄設(shè)置方法set_progressbar(),用來(lái)設(shè)置進(jìn)度欄的值:

Python中如何使用多線程保持GUI的響應(yīng)

修改一下進(jìn)度欄的啟動(dòng)方法start_progressbar()。刪除while循環(huán),添加進(jìn)度欄計(jì)數(shù)器到其中(因?yàn)檫M(jìn)度欄計(jì)數(shù)器中已經(jīng)實(shí)現(xiàn)了while循環(huán)增加數(shù)值):

Python中如何使用多線程保持GUI的響應(yīng)

修改進(jìn)度欄的停止方法stop_progressbar(),添加線程的stop()方法用來(lái)停止線程:

Python中如何使用多線程保持GUI的響應(yīng)

修改完成后,我們運(yùn)行程序,看看效果:

Python中如何使用多線程保持GUI的響應(yīng)

通過(guò)終端打印出來(lái)的信息,我們可以直觀的看到QThread線程的管理控制。

看完上述內(nèi)容,你們對(duì)Python中如何使用多線程保持GUI的響應(yīng)有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI