PyQtテスト(QThreadスレッドとカスタム信号):QProgressDialogでコピー進捗を表示する
粗いテストコード......
from PyQt5.Qt import *
import sys, shutil, os, time
class CopyFile(QThread):
# , : ,
pathError = pyqtSignal()
def setFile(self,src, dst):
# ,
self.src = src
self.dst = dst
def run(self):
if os.path.exists(self.src):
shutil.copy2(self.src, self.dst)
else:
self.pathError.emit()
class CopyProgress(QThread):
# , 。
checked = pyqtSignal(int)
def setFile(self, src, dst):
# ,
self.src = src
self.dst = dst
self.value = 0
def run(self):
while 1:
time.sleep(1)
if os.path.getsize(self.src)>os.path.getsize(self.dst):
self.value = int(os.path.getsize(self.dst)/os.path.getsize(self.src)*100)
else:
self.value = 100
if self.value == 100:
self.checked.emit(100)
break
self.checked.emit(self.value)
class Mwindow(QWidget):
def __init__(self):
super().__init__()
self.resize(300,200)
self.src = "../movie4.mkv"
self.dst = "E:\\movie4.mkv"
self.initui()
def initui(self):
self.pg = QProgressDialog(self)
self.pg.setMinimumDuration(1)
button = QPushButton(self)
button.setText(" - ")
button.clicked.connect(lambda:self.copy_file())
def copy_file(self):
self.copy_thread = CopyFile()
self.copy_thread.setFile(self.src,self.dst)
self.copy_thread.pathError.connect(lambda:print(" "))
self.copy_thread.start()
self.show_copy()
def show_copy(self):
self.show_progress = CopyProgress()
self.show_progress.start()
self.show_progress.setFile(self.src, self.dst)
self.show_progress.checked.connect(lambda v:self.pg.setValue(v))
app = QApplication(sys.argv)
w = Mwindow()
w.show()
sys.exit(app.exec_())