簡體   English   中英

PySide / Python GUI凍結

[英]PySide / Python GUI freezes

我目前正在為rvplayer編寫一個GUI,它可以讓藝術家自動使用平板和老化信息來呈現樣片。 GUI使用PySide編寫,並在Python 2.7中編寫腳本。 我的問題是,在調用我的進程並使用stdout更新我的QProgressBar ,GUI會凍結。 我知道這是一個常見的問題,它可能會以某種方式解決processEvents() ,但我對線程和進程循環知之甚少,無法解決這個問題。 由於我的代碼已經有點冗長,因此導致問題的部分是:

def rv(self, args):
    p = subprocess.Popen(["C:/Program Files/Tweak/RV-4.0.10-64/bin/rvio_hw.exe"]+[x for x in args], stdout=subprocess.PIPE)
    while True:
        line = p.stdout.readline()
        if line != "":
            progressStr=re.search(r"([0-9]+.[0-9]+%)", line.rstrip())
            if progressStr == None:
                print line.rstrip()
            else:
                progressInt=int(float(re.sub("[^0123456789\.]", "", progressStr.group())))
                self.prog_QProgressBar.setValue(progressInt)
                print progressStr.group()
        else:       
            break

這是啟動我的QApplication的部分:

if __name__ == "__main__":

    app = QtGui.QApplication(sys.argv)
    finalForm = MainWindow()
    finalForm.show()
    sys.exit(app.exec_())

我按下按鈕調用函數rv,雖然進度條保持正常更新,但窗口在一段時間后開始無響應。 我不明白我可以使用app.processEvents()告訴我的QApplication在單獨的線程或后台運行該進程。

因為看起來你沒有使用線程,所以所需要的只是在更新進度條后調用processEvents ,如下所示:

    self.prog_QProgressBar.setValue(progressInt)
    QtGui.qApp.processEvents()

但是,這種效果可能取決於生產輸出過程需要多長時間。 processEvents調用的所有操作都是立即處理當前在應用程序事件隊列中的任何掛起事件(例如,小部件繪制,鼠標單擊等)。 在這些調用之間,GUI將繼續凍結(即執行代碼不在單獨的線程中或在后台運行,如您所建議的那樣)。 因此,此技術可以保持GUI響應的程度取決於在rv()方法中調用processEvents頻率。

問題是,它不像你的應用程序被凍結,但是Windows認為該應用程序被凍結,因為它忽略了事件(鼠標懸停,點擊等等),因此Windows以其智慧為您提供了對話。

你需要在show()之后啟動線程然后運行processEvents函數,顯然只有在線程完成后才調用sys.exit。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM