ich werde von einigen Regulars darauf hingewiesen, dass ich GUI und Logik sauber voneinander trennen soll. Ist dies aber nicht nur begrenzt möglich? Ich stütze mich mal wieder auf meinen Quelltext - konkret: auf die run()-Funktion im QThread (Zeile 43-84). Würde ich also die Funktion innerhalb von run extrahieren, sähe dies dann wie folgt aus:
Code: Alles auswählen
FILE_NAME = "downloader.py"
try:
import os
import sys
import requests
print "STATUS [OK] ", FILE_NAME
print "STATUS [MESSAGE] (", FILE_NAME, "): All modules are imported"
except ImportError as ImpErr:
print "STATUS [FAILED] ", FILE_NAME
print "STATUS [MESSAGE] (", FILE_NAME, "): ", ImpErr
raise
def download(file_url, temp_location):
try:
download_file = requests.get(file_url, stream=True)
except (requests.exceptions.URLRequired,
requests.exceptions.ConnectionError,
requests.exceptions.HTTPError,
requests.exceptions.Timeout,
requests.exceptions.ConnectTimeout,
requests.exceptions.ReadTimeout), g:
print 'Could not download ', g
self.error_http.emit()
else:
file_size = int(requests.head(file_url).headers.get('content-length', [0]))
print "%s Byte" %file_size
result = file_size / (1024*5)
print result
chunk_size = int(result)
downloaded_bytes = 0
try:
with open(temp_location, 'wb') as fd:
for chunk in download_file.iter_content(chunk_size):
fd.write(chunk)
downloaded_bytes = fd.tell()
print (float(downloaded_bytes)/file_size*100)
#return (float(downloaded_bytes)/file_size*100)
except IOError as IoErr:
print IoErr
else:
print "Finish"
return 'Done'
#self.finished_download.emit()
#self.finished_thread.emit()
if __name__ == '__main__':
base_path = os.path.dirname(os.path.abspath(__file__))
temp_path = os.path.join(base_path, 'temp', 'example-app-0.3.win32.zip')
download_url = 'http://sophus.bplaced.net/download/example-app-0.3.win32.zip'
download(download_url, temp_path)
Code: Alles auswählen
from xarphus.core.downloader import download
class Download_Thread(QThread):
finished_thread = pyqtSignal()
error_http = pyqtSignal()
finished_download = pyqtSignal()
notify_progress = pyqtSignal(int)
def __init__(self, location, link, parent=None):
QThread.__init__(self, parent)
self.url = link
self.location = location
print self.location
self._run_semaphore = QSemaphore(1)
def run(self):
return_value = download(self.url, self.location)
print return_value
if return_value == "Done":
self.finished_download.emit()
Wenn ich es also richtig verstehe, dann muss ich gezwungendermaßen die download-Funktion in der run()-Funktion belassen, so wie es im Quelltext, den ich verlinkt habe, zu sehen ist, und eine klare Trennung wäre hier nicht möglich? Oder habe ich etwas übersehen?
Mir geht es nicht um den Download-QThread per se, sondern um die Handhabung der Funktion. Mir fiel auf Anhieb keine weitere Funktion ein, in welcher innerhalb der Funktion nicht nur eine Sache kurz erledigt und am Ende der Wert zurückgegeben wird, sondern wo innerhalb der Funktionen viele Zwischenschritte gibt. Und diese Download-Funktion nahm ich nur als ein Beispiel, um zu zeigen, dass ich da ein Verständnis-Problem habe, inwiefern ich in solcher Konstellation mit einer Progressbar arbeiten könnte, wenn ich die Funktion extrahiere.
