2017-07-28 88 views
1

我試圖複製一個包含在PyQt5中的進度條的文件。我可以在與print("Copied: {}".format(percent))的控制檯中看到100%被複制。PyQt5 - 爲什麼進度條不顯示文件複製進度?

但是,我的進度欄不會更新我的複製過程。我如何檢查信號是否已發送?我在哪裏犯錯?

import os, sys 
from PyQt5 import QtWidgets, QtCore 

class Extended(QtCore.QThread): 
    def __init__(self): 
     super().__init__() 
     self.src_file = 'test.txt' 
     self.dst_file = 'test_copy.txt' 
     self.copyfileobj(self.src_file, self.dst_file, self.cb) 

    copied_percent = QtCore.pyqtSignal(int) 

    def cb(self, temp_file_size): 
     self.file_size = os.stat(self.src_file).st_size 
     percent = int(temp_file_size/self.file_size*100) 
     print("Copied: {}".format(percent)) 
     self.copied_percent.emit(percent) 

    def copyfileobj(self, fsrc, fdst, callback, length=16*1024): 
     copied = 0 
     with open(fsrc, "rb") as fr, open(fdst, "wb") as fw: 
      while True: 
       buff = fr.read(length) 
       if not buff: 
        break 
       fw.write(buff) 
       copied += len(buff) 
       callback(copied) 


class MyApp(QtWidgets.QWidget): 

    def __init__(self, parent=None): 
     super().__init__(parent) 

     self.w = QtWidgets.QWidget() 
     self.w.setWindowTitle("Progress bar copy test") 

     # Add widgets on the window 
     self.copy_button = QtWidgets.QPushButton("Copy", self) 
     self.copy_button.sizeHint() 
     self.progress_bar = QtWidgets.QProgressBar(self) 
     self.progress_bar.setGeometry(0, 40, 300, 25) 
     self.progress_bar.setMaximum(100) 

     self.copy_button.clicked.connect(self.on_button_click) 

    def on_button_click(self): 
     self.copy_button.setDisabled(True) 
     self.ext = Extended() 
     self.ext.copied_percent.connect(self.on_count_change) 
     self.ext.start() 

    def on_count_change(self, value): 
     self.progress_bar.setValue(value) 


if __name__ == '__main__': 
    app = QtWidgets.QApplication(sys.argv) 
    prog = MyApp() 
    prog.show() 
    sys.exit(app.exec_()) 

回答

0

好的,我想通了。當您在實例對象self.ext上調用start()方法時,在線程支持的類中必須有run方法。我還添加了self.ext.join()方法來在線程執行完成之前不結束程序。

import os, sys 
from PyQt5 import QtWidgets, QtCore 


class Extended(QtCore.QThread): 
    """ 
    For running copy operation 
    """ 
    copied_percent_signal= QtCore.pyqtSignal(int) 

    def __init__(self): 
     super().__init__() 
     self.src_file = 'test.txt' 
     self.dst_file = 'test_copy.txt' 
     self.file_size = os.stat(self.src_file).st_size 

    def run(self): 
     self.copyfileobj(self.src_file, self.dst_file, self.my_callback) 

    def my_callback(self, temp_file_size): 
     percent = int(temp_file_size/self.file_size*100) 
     print("Copiedd: {}".format(percent)) 
     self.copied_percent_signal.emit(percent) 

    def copyfileobj(self, fsrc, fdst, callback, length=16*1024): 
     copied = 0 
     with open(fsrc, "rb") as fr, open(fdst, "wb") as fw: 
      while True: 
       buff = fr.read(length) 
       if not buff: 
        break 
       fw.write(buff) 
       copied += len(buff) 
       callback(copied) 


class MyApp(QtWidgets.QWidget): 

    def __init__(self, parent=None): 
     super().__init__(parent) 

     # Instance attribute defined later in on_button_click() 
     self.ext = None 

     self.w = QtWidgets.QWidget() 
     self.w.setWindowTitle("Progress bar copy test") 

     # Add widgets on the window 
     self.copy_button = QtWidgets.QPushButton("Copy", self) 
     self.copy_button.sizeHint() 
     self.progress_bar = QtWidgets.QProgressBar(self) 
     self.progress_bar.setGeometry(0, 40, 300, 25) 
     self.progress_bar.setMaximum(100) 

     self.copy_button.clicked.connect(self.on_button_click) 

    def on_button_click(self): 
     self.copy_button.setDisabled(True) 
     self.ext = Extended() 
     self.ext.copied_percent_signal.connect(self.on_count_change) 
     self.ext.start() 
     self.ext.join() 

    def on_count_change(self, value): 
     self.progress_bar.setValue(value) 


if __name__ == '__main__': 
    app = QtWidgets.QApplication(sys.argv) 
    prog = MyApp() 
    prog.show() 
    sys.exit(app.exec_()) 

我的文件正在被複制,進度條正在工作。