ich hab folgenden Code:
Code: Alles auswählen
from PyQt5 import QtWidgets, uic, QtCore,QtGui
from PyQt5.QtCore import QThread, pyqtSignal
import sys
from pathlib import Path
import time
import shutil
import os
class FileTransferThread(QThread):
updateProgress = pyqtSignal(int, float,int) # Signal für Fortschrittsanzeige und Geschwindigkeitsanzeige
transferFinished = pyqtSignal(float) # Signal für Geschwindigkeitsanzeige
def __init__(self, source_path, target_path,parent=None):
super().__init__(parent)
QThread.__init__(self)
self.source_path = source_path
self.target_path = target_path
self.is_running = False
self.abort = False
self.avg_speed = 0.0 # initialize avg_speed here
def run(self):
self.is_running = True
buffer_size = 1024 * 1024 # 1MB buffer
bytes_transferred = 0
start_time = time.time()
with open(self.source_path, 'rb') as source_file:
with open(self.target_path, 'wb') as target_file:
while self.is_running:
buffer = source_file.read(buffer_size)
if not buffer:
break
target_file.write(buffer)
bytes_transferred += len(buffer)
elapsed_time = time.time() - start_time
self.avg_speed = bytes_transferred/buffer_size / elapsed_time
remaining_time=int(os.path.getsize(self.source_path)/(1024*1024)/self.avg_speed-elapsed_time)
progress = bytes_transferred / os.path.getsize(self.source_path) * 100
self.updateProgress.emit(int(progress), self.avg_speed,remaining_time)
if self.abort:
break
shutil.copystat(self.source_path, self.target_path)
self.is_running = False
self.transferFinished.emit(self.avg_speed)
def stop(self):
self.is_running = False
self.abort = True
self.wait()
self.transferFinished.emit(self.avg_speed)
class Transfer_File(QtWidgets.QDialog):
def __init__(self):
super(Transfer_File, self).__init__()
uic.loadUi(Path(__file__).absolute().parent / "ui/Transfer.ui",self)
dir="D:\\Downloads"
move_file="serie-xy.mp4"
destination_path="X:\\Serienl\\XY\\staffel"
self.lbl_speed.setText('Speed: 0 MB/s')
self.movie = QtGui.QMovie(str(Path(__file__).absolute().parent / "grafics/transfer.gif"))
self.label_gif_transfer.setMovie(self.movie)
self.movie.start()
self.lbl_move_file.setText(move_file)
self.lbl_Source_Folder.setText(dir)
self.lbl_Dest_Folder.setText(destination_path)
self.prgBar_Transfer.setValue(0)
self.startTransfer(dir +"/"+ move_file,destination_path +"/"+ move_file)
def startTransfer(self,source_path,dest_path):
self.transferThread = FileTransferThread(source_path, dest_path)
self.transferThread.updateProgress.connect(self.updateProgress)
self.transferThread.finished.connect(self.transferFinished)
self.transferThread.start()
self.btn_Stop.clicked.connect(self.transferThread.stop)
def updateProgress(self, value,speed,remaining_time):
self.btn_OK.setVisible(False)
#self.Btn_OK.clicked.connect(self.Ordner_Transfer_Zurueck)
#self.exec_()
self.prgBar_Transfer.setValue(value)
minutes, seconds = divmod(remaining_time, 60)
self.lbl_speed.setText(f"{speed:.2f} MB/s - geschätze Zeit bis Ende: {minutes:02d}:{seconds:02d}s")
def transferFinished(self,avg_speed):
self.btn_OK.setVisible(True)
self.transferThread.quit()
self.transferThread.wait()
self.movie.stop()
self.label_gif_transfer.setPixmap(QtGui.QPixmap(str(Path(__file__).absolute().parent / "grafics/transfer.png")))
self.lbl_speed.setText(f"{avg_speed:.2f} MB/s - geschätzte Zeit bis zum Ende: 00:00s > FERTIG !!!")
if __name__ == "__main__":
app,QtWidgets.QDialog =(QtWidgets.QApplication(sys.argv),Transfer_File())
QtWidgets.QDialog.show()
sys.exit(app.exec_())
wahrscheinlich kann er kein self übergeben, zumindest denke ich mir das.
sobald er an dieser Zeile "def transferFinished(self,avg_speed): " kommt und die Funtion aufrufen will, kommt der Fehler.
in der stop() Funktion ist ja self.transferFinished.emit(self.avg_speed) also mit übergabe von self.avg_speed und nicht mit avg_speed
allerdings so:
Code: Alles auswählen
def stop(self):
avg_speed=self.avg_speed
self.is_running = False
self.abort = True
self.wait()
self.transferFinished.emit(avg_speed)
ich hoffe einer weiss ein Rat
