在PyQt裡面如何做長操作時同時更新GUI

2021-07-02 20:17:44 字數 3965 閱讀 7401

經常看到有人問在pyqt裡面如何做長操作的時候更新gui。我自己總結了幾種方案,以及他 們的適用場合:

使用processevents(),適合每次處理時間短的情況,缺點是cpu占用可能很大:

for

filename

inos

.listdir

(pathtoyourdir

):dosomething

()updategui().

processevents

()

用qthread,用qmetaobject.invokemethod()向主線程傳遞跨執行緒的資訊

class

mywindow

(qmainwindow

):@pyqtslot

(int

)def

updateprogress

(self

,value

):self

.lblprogress

=str

(value

)class

processorthread

(qthread

):def

__init__

(self

,mywindow

):qthread

.__init__

(self

)self

.mywindow

=mywindow

defrun

(self

):for

filename

inos

.listdir

():dosomething

()progress=29

#計算百分比

qmetaobject

.invokemethod

(self

.mywindow

,"updateprogress"

, \ qt

.queuedconnection

,q_arg

("int"

,progress

)

此方案還有乙個變種是使用跨執行緒的signal/slot:

class

mywindow

(qmainwindow

):def

__init__

(self

):self

.processorthread

=processorthread

()self

.processorthread

.progressupdated

.connect

( \ self

.updateprogress,qt

.queuedconnection

)@pyqtslot

(int

)def

updateprogress

(self

,value

):self

.lblprogress

=str

(value

)class

processorthread

(qthread

):progressupdated

=pyqtsignal

(int

)def

__init__

(self

):qthread

.__init__

(self

)#沒有parent引數

self

.movetothread

(self

)def

run(

self

):for

filename

inos

.listdir

():dosomething

()progress=29

#計算百分比

self

.progressupdated

.emit

(progress

)

qprogressdialog。有同步與非同步兩種方法。先看看同步。

buf=io

.stringio

()progress

=qprogressdialog

(self

.trutf8

("開啟檔案"

), \

self

.trutf8

("取消"),0

,f.size

(),self

)progress

.setwindowmodality(qt

.windowmodal

)while

notf

.atend

():data=f

.read

(1024

)text

=data

.decode

(locale

.getpreferredencoding

())buf

.write

(text

)progress

.setvalue(f

.pos

())if

progress

.wascanceled

():return

self

.textedit

.setplaintext

(buf

.getvalue

())progress

.setvalue(f

.size

())#100%的時候對話方塊自動關掉

progress

.setparent

(none

)#清理資源

非同步與第二種方案類似,但是採用signal/slot,而且不能是模態對話方塊。

把長的操作分為小的操作,適合每次處理都是非同步的或者很複雜的情況

def

__init__

(self

):self

.itorator

=self

.fetchfile

()self

.timer

=qtimer

()self

.timer

.timeout

.connect

(self

.processfile

)self

.timer

.start(0

)def

fetchfile

(self

):for

filename

inos

.listdir

(pathtoyourdir

):yield

filename

defprocessfile

():try

:filename

=self

.itorator

.next

()dosomething

()updategui

()except

stopiterator

:self

.timer

.stop

()

第四種方案不常用,但是當你的處理過程本身是非同步的時候就會用到。第

一、第二方案都不 錯,優點是靈活。第三種方案也常見,優點是模態對話方塊阻止使用者的其它操作,可以隨時取 消。缺點是乙個對話方塊擋在那裡,相當地影響使用者體驗。

ps:這些**不能直接執行。。。差不多懂就好,呵呵

zzhiyuan(十月 28, 2013, 9:14 p.m.) 

等我做完成了,會來膜拜的,這東西找半天了。

在idea裡面如何配置自己的tomcat

在bin目錄裡面找到 雙擊開啟是不是會出現 然後再在bin裡面找到 shutdown.bat 雙擊給他關閉了 第三 在我的電腦裡面右擊屬性來進行環境變數的配置 然後再classpath後面加上 然後在path的變數值中加入 點選確定然後我們的tomcat的環境變數就配置好啦 第四 我們現在要去ide...

純靜態頁面如何做301重定向

昨天遇見乙個棘手的問題,就是頁面是純靜態的,空間是iis的,空間商又不讓改配置,怎麼辦?首先宣告我是乙個新手,下面寫寫我一天的心得。先上 然後再解釋 1 對於純asp寫的 把這段直接複製到conn,asp頁面裡面即可,或者在首頁上也可以,要寫在整個文件的前面,這個就隨便說說了,很簡單。2 純html...

實操講解跨境牛Facebook群控如何做營銷

跨境牛facebook群控的營銷說起來也就幾個方面,操作起來卻會發現各種問題,營銷套路也是每天多變,今天小編就和大家一起來揭秘一下跨境牛facebook群控的神秘面紗。一 官方專頁 一般就是寫寫當天的活動,新聞什麼的。我只能說,專頁的運營主要是維護客戶關係,做社交,廣告偶爾發一次就好了,天天沒事就刷...