wxPython - Fortschrittsanzeige mit Kopierfunktion verknüpfen

Plattformunabhängige GUIs mit wxWidgets.
Antworten
HarryH
User
Beiträge: 266
Registriert: Freitag 23. Mai 2003, 09:08
Wohnort: Deutschland

Hallo,

Ich habe ein Problem!
Ich möchte ein "wxGauge" Widget mit der Funktion "shutil.copy" verbinden.
Sozusagen eine Fortschrittsanzeige für eine Kopierfunktion von Files.
GUI-Tool ist WxPython.
Wie geht das? :?: Könnte mir da bitte jemand helfen.

Danke!
Harry
joerg
User
Beiträge: 188
Registriert: Samstag 17. August 2002, 17:48
Wohnort: Berlin
Kontaktdaten:

HarryH hat geschrieben: Sozusagen eine Fortschrittsanzeige für eine Kopierfunktion von Files.
Da wirst Du wohl eine eigene copy()-Funktion schreiben müssen. shutil.copy() kehrt doch erst wieder zurück, wenn der Kopiervorgang beendet ist und bietet keine Möglichkeit, eine Anzeigefunktion einzuklinken.

Vielleicht solltest Du shutil.copyfileobj() als Vorlage nehmen und in die Schleife eine Update-Funktion für den Fortschrittsbalken einfügen.

Jörg
joerg
User
Beiträge: 188
Registriert: Samstag 17. August 2002, 17:48
Wohnort: Berlin
Kontaktdaten:

Da ich wohl gerade abgelenkt werden wollte ;-) habe ich mal noch ein Beispiel geschrieben. Die Funktion copy() ist zusammenkopiert aus verschiedenen Funktionen aus shutil.

progress() malt einen simplen Fortschrittsbalken im Textmodus (zumindest im Linux-Terminal).

copy() kopiert die Datei stückweise, berechnet nach jedem Teilstück den Fortschritt (in Prozent) und ruft die als pfunc übergebene Funktion zur Anzeigeaktualisierung auf. Hier müßte natürlich statt progress() bei Dir eine Funktion zur Aktualisierung des wx-Dingsbums übergeben werden.

Viel Spaß!

Code: Alles auswählen

#!/usr/bin/env python
import os, sys, stat

def progress(p):
    """draw a little progress bar showing the percentage p"""
    x = int(p/2)
    y = 50 - x
    sys.stdout.write('\r|%s%s| % 3d%% |' % ('#'*x, '_'*y, p))
    if p == 100:
        sys.stdout.write(' Done!\n')
    sys.stdout.flush()

def copy(src, dst, pfunc=None, buflen=1024*16):
    """copy a file src to dst, calling the progress function
    pfunc to give a little feedback, copy buflen bytes at once"""
    if os.path.isdir(dst):
        dst = os.path.join(dst, os.path.basename(src))
    if pfunc:
        size = os.stat(src)[stat.ST_SIZE]
        bytes = 0
    fsrc = None
    fdst = None
    try:
        fsrc = open(src, 'rb')
        fdst = open(dst, 'wb')
        while 1:
            buf = fsrc.read(buflen)
            if not buf:
                break
            fdst.write(buf)
            if pfunc:
                bytes += len(buf)
                pfunc(100*bytes/size)
    finally:
        if fdst:
            fdst.close()
        if fsrc:
            fsrc.close()
    if hasattr(os, 'chmod'):
        st = os.stat(src)
        mode = stat.S_IMODE(st[stat.ST_MODE])
        os.chmod(dst, mode)


if __name__ == '__main__':
    if len(sys.argv) < 3:
        print "Usage: %s <source> <destination>" % (sys.argv[0])
        sys.exit(42)
    src, dst = sys.argv[1:3]
    copy(src, dst, progress)

HarryH
User
Beiträge: 266
Registriert: Freitag 23. Mai 2003, 09:08
Wohnort: Deutschland

Vielen Dank Joerg!

Dein Beispielskrip hat mir sehr geholfen!
Ich habe es nur noch ein wenig an meine Bedürfnisse
angepaßt.

Danke nochmal!
Harry
Antworten