經常看到有人問在pyqt裡面如何做長操作的時候更新gui。我自己總結了幾種方案,以及他 們的適用場合:
使用processevents()
,適合每次處理時間短的情況,缺點是cpu占用可能很大:
forfilename
inos
.listdir
(pathtoyourdir
):dosomething
()updategui().
processevents
()
用qthread,用qmetaobject.invokemethod()
向主線程傳遞跨執行緒的資訊
classmywindow
(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:
classmywindow
(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群控的神秘面紗。一 官方專頁 一般就是寫寫當天的活動,新聞什麼的。我只能說,專頁的運營主要是維護客戶關係,做社交,廣告偶爾發一次就好了,天天沒事就刷...