Erst das Geschäftliche, dann das Vergnügen
Verfasst: Freitag 8. Mai 2015, 15:47
Hallo Leute,
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:
Und die run()-Funktion im QThread dann so:
Wenn die download()-Funktion am Ende fertig ist (Zeile 44), gibt die Funktion einen Wert zurück, hier 'Done'. In der run()-Funktion frage ich nach dem Wert return_value ob in dieser 'Done' steht, und wenn ja, wird ein Emit-Signal abgesetzt. Soweit klappt es auch alles. Aber wo ich allerdings ein Problem sehe, ist, das man nicht mit der Progressbar arbeiten kann. Denn würde ich Zeile 39 dekommentieren - also aus dem Kommentar rausnehmen, so würde die Schleife nur ein einziges Mal durchlaufen, da der return die Funktion beendet.
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.
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.