Seite 1 von 1
Daten Upload mit GTK
Verfasst: Donnerstag 21. Mai 2009, 10:52
von scrippi
Hallo Com
hätte eine Frage wie man folgende idee realisiert:
Habe zB einen Server mit einer CGI bei der ich über nen post den dateinamen und die datei selbst senden kann. Während des Prozesses kann CGI schon sagen wieviel Prozenz ich bereits raufgeladen habe und mit einer anderen könnte ich diese information aufrufen.
Ich weiß zB nich ob das python geht, dass wenn ich grade eine offene verbindung mit http habe, sprich die während des gesammten upload prozesses aktiv is und alle 4 sekunden ausgabe macht, ob ich diese mit python verarbeiten kann.
Das andere wäre, wie könnte man das dann so umsetzen das dabei das programm noch nutzbar is und nicht einfriert. Und naja Prozessbar natürlich mit drin und so..
Dachte mir das da zB ersma urllib zur sprache kommt und threads....nur frage is halt wie man das genau macht.
Kann mir einer nen Tipp geben oder nen code beispiel?
danke
mfg
scrippi
Verfasst: Freitag 22. Mai 2009, 15:53
von veers
Tipp: Lies die Dokumentation zu den Modulen und stell dann konkrete Fragen.

Verfasst: Samstag 23. Mai 2009, 12:04
von scrippi
Naja mir ist einfach nich klar wie ich einen Upload/Download Prozess mit prozessbalken bauen kann ohne dass das programm einfriert, bzw das man einfach den prozess im hintergrund hat.
Und eben ob Urllib langzeitige http verbindungen offen halten kann ( wie zb bei einem WebCGI Dateiupload)
Verfasst: Samstag 23. Mai 2009, 13:57
von Dauerbaustelle
Zerstückele die Datei in x-Kilobytes-Blöcke update den Fortschrittsbalken jedes mal :-)
Verfasst: Samstag 23. Mai 2009, 14:23
von Dauerbaustelle
Und weils Spaß macht:
Code: Alles auswählen
from sys import stdout
from time import sleep
from os.path import getsize
path = ('/deine/tolle/datei')
def progressed_read(stream):
size = getsize(path)
while stream.tell() < size:
yield stream.read(1024**2)
# 1 MB
print '*',
stdout.flush()
sleep(0.05)
with open(path) as stream:
fragments = progressed_read(stream)
data = ''.join(fragments)
Verfasst: Samstag 23. Mai 2009, 14:40
von BlackJack
@Dauerbaustelle: "Streams" haben in der Regel keine abfragbare Grösse, da ist die Namensgebung ungünstig.
Warum ist der `path` in Klammern!?
Verfasst: Samstag 23. Mai 2009, 15:14
von Dauerbaustelle
BlackJack hat geschrieben:Warum ist der `path` in Klammern!?
Äh, weil ich da nen ewiglangen Pfad drinne hatte, und hätte ich keine Klammer drumrumgemacht, hätte ich Einrückungsfehler für die zweite und dritte Zeile bekommen und das war mir alles viel zu anstrengend :-)
Verfasst: Sonntag 24. Mai 2009, 18:51
von veers
scrippi hat geschrieben:Naja mir ist einfach nich klar wie ich einen Upload/Download Prozess mit prozessbalken bauen kann ohne dass das programm einfriert, bzw das man einfach den prozess im hintergrund hat.
Und eben ob Urllib langzeitige http verbindungen offen halten kann ( wie zb bei einem WebCGI Dateiupload)
http://docs.python.org/library/threading.html damit kannst du weitere Threads starten.
http://www.google.ch/search?q=urllib+file+upload da findest du heraus wie du file uploads startest.
http://www.google.ch/search?q=urllib2+progress und da wie du den Status herausfindest.
Das zusammenkleben überlasse ich dir

Verfasst: Sonntag 24. Mai 2009, 20:46
von scrippi
Danke danke
es ist zwar noch ein wenig tricky wegen dem upload, da an der Stelle viel vom Upload script auf dem Server abhängig ist, jedoch als Downloadscript konnte ich eine Solide lösung finden
hier meine Codes:
load_progress.glade
Code: Alles auswählen
<?xml version="1.0"?>
<interface>
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy project-wide -->
<object class="GtkWindow" id="window1">
<property name="visible">True</property>
<child>
<object class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkEntry" id="entry1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="invisible_char">●</property>
</object>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button1">
<property name="label" translatable="yes">button</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkProgressBar" id="progressbar1">
<property name="visible">True</property>
<property name="activity_mode">True</property>
<property name="text" translatable="yes">Prozess</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
</object>
</interface>
download_progress1.py
Code: Alles auswählen
#!/usr/bin/env python
#Importiere die Ganzen Mist hierrein
import sys
import os
import urllib
try:
import pygtk
pygtk.require("2.0")
except:
raise ImportError("Could not import pygtk")
try:
import gtk
import gtk.glade
except:
raise ImportError("Could not import the module gtk")
sys.exit(1)
from threading import Thread
class DownloadProgress(Thread):
"""
Klasse zur Darstellung des Programms
"""
def __init__(self):
Thread.__init__(self)
#Set the Glade file
self.gladefile = "download_progress.glade"
self.wTree = gtk.glade.XML(self.gladefile)
self.window = self.wTree.get_widget("window1")
self.window.connect("destroy",gtk.main_quit) #Beenden einstellen
#Binde Objekte ins Dokument
button = self.wTree.get_widget("button1")
self.tf = self.wTree.get_widget("entry1")
button.connect("released",self.loading)
self.pbar = self.wTree.get_widget("pbar")
self.pbar.set_fraction(0)
def run(self):
gtk.gdk.threads_enter()
gtk.main()
gtk.gdk.threads_leave()
def loading(self,w,d=None):
"""
Eventfunktion von button1
Argumente
self - <Object> Selfobject
w - <Object> Widgektobject
d - <String> URL
"""
d = self.tf.get_text()
url = d
base = url[url.rindex('/')+1:]
#Beginne Thread
current = loadFile(url, base, self)
current.start()
#current.join()
class loadFile(Thread):
"""
Klasse zum Laden der Datei
"""
def __init__(self,url,dst,obj):
Thread.__init__(self)
self.url = url
self.dst = dst
self.obj = obj
print "started"
def run(self):
print "joined"
print "get url '%s' to '%s'" % (self.url, self.dst)
if sys.stdout.isatty():
urllib.urlretrieve(self.url, self.dst,
lambda nb, bs, fs, url=self.url: _reporthook(nb,bs,fs,self.url,self.obj))
sys.stdout.write('\n')
else:
urllib.urlretrieve(self.url, self.dst,
lambda nb, bs, fs, url=self.url: _reporthook(nb,bs,fs,self.url,self.obj))
sys.stdout.write('\n')
def _reporthook(numblocks, blocksize, filesize, url, obj):
"""
Partielles Laden der Datei
"""
base = os.path.basename(url)
#XXX Should handle possible filesize=-1.
try:
percent = min((numblocks*blocksize*100)/filesize, 100)
except:
percent = 100
obj.pbar.set_fraction(percent * 0.01)
obj.pbar.set_text("%s Percent of %s" % (percent,base))
if __name__ == "__main__":
# python download_progress1.py help
if len(sys.argv) == 2 and sys.argv[1] == "help":
help(DownloadProgress)
help(loadFile)
exit()
#Starte alle Threads
gtk.gdk.threads_init()
t = DownloadProgress()
t.start()