Daten Upload mit GTK

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
scrippi
User
Beiträge: 31
Registriert: Montag 6. April 2009, 10:37

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
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Tipp: Lies die Dokumentation zu den Modulen und stell dann konkrete Fragen. :wink:
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
scrippi
User
Beiträge: 31
Registriert: Montag 6. April 2009, 10:37

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)
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Zerstückele die Datei in x-Kilobytes-Blöcke update den Fortschrittsbalken jedes mal :-)
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

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)
BlackJack

@Dauerbaustelle: "Streams" haben in der Regel keine abfragbare Grösse, da ist die Namensgebung ungünstig.

Warum ist der `path` in Klammern!?
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

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 :-)
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

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 :wink:
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
scrippi
User
Beiträge: 31
Registriert: Montag 6. April 2009, 10:37

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()
Antworten