Hi John,

John Dennis schrieb am 04/16/2007 06:05 PM:
> On Mon, 2007-04-16 at 19:55 +0000, Fabian Braennstroem wrote:
>> Hi,
>>
>> I would like to add a progressbar for file managing such as copying,
>> deleting, moving. Unfortunately I don't understand the handling of
>> the progressbar...
>> As a first try I would like to use the 'pulse' function for the
>> progressbar, i.e. as long as I copying files I would like to 'pulse'
>> the bar. Below you can see a small example; I get the progressbar
>> moving, but not during the copying process :-(
>>
>> #!/usr/bin/env python
>>
>>
>> import pygtk
>> pygtk.require('2.0')
>> import gtk
>> import shutil
>> from time import sleep
>>
>>
>> file1="/home/fab/.bashrc"
>>
>> class Buttons:
>>     def callback(self, widget, data=None):
>>         i=0
>>         n=100
>>
>>         self.progress.pulse()
>>         self.progress.set_text("Calculating....")
>>         self.progress.grab_add()
>>
>>         shutil.copy(file1,"progressbar_copy")
>>         while i < n:
>>             sleep(0.015)
>> #            self.progress.set_fraction(i/(n - 1.0))
>>             self.progress.pulse()
>>             i += 1
>>
>>             while gtk.events_pending():
>>                 gtk.main_iteration_do(False)
>>
>>         self.progress.set_fraction(0.0)
>>         self.progress.set_text("")
>>         self.progress.grab_remove()
>>
>>     def __init__(self):
>>         self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
>>
>>         self.window.connect("destroy", lambda wid: gtk.main_quit())
>>         self.window.connect("delete_event", lambda
>> a1,a2:gtk.main_quit())
>>         self.window.set_border_width(10)
>>         box = gtk.HBox()
>>
>>         self.progress= gtk.ProgressBar()
>>         button = gtk.Button("Button")
>>         button.connect("clicked", self.callback, "cool button")
>>
>>         button.show()
>>         self.progress.show()
>>         box.add(self.progress)
>>         box.add(button)
>>         box.show()
>>
>>
>>         self.window.add(box)
>>         self.window.show()
>>
>> def main():
>>     gtk.main()
>>     return 0
>>
>> if __name__ == "__main__":
>>     Buttons()
>>     main()
>>
>>
>> A next step would be, to display the remaing bytes and percentage of
>> the copied file until completion (like the midnight commander is
>> doing). How can I achive this? The progressbar has to know the size
>> and the actual copied/moved/deleted number of bytes... Does anyone
>> has an idea? Would be nice ...
>>
>> I am doing the file managing with 'shutil' or 'os' modules.
> 
> Your basic problem is you're trying to code what is essentially a
> parallel operation in a synchronous manner. To move the progress bar you
> have to call the functions to move it (e.g. pulse or set_fraction), but
> you can't do that if you're waiting on a synchronous operation to
> complete (or worse calling sleep). You have a few choices, either do the
> copy yourself in a loop where you copy chunks of data and update the
> progress bar, find an API which does the copy in a thread and provide
> progress callbacks (sorry I'm not aware of such an API), or do the
> threading yourself. FWIW, here is a code snippet of mine, it installs a
> timeout function to pulse the progress bar every 1/10 sec until the
> operation completes. The trick here is that the operation is being
> handled in another thread so it proceeds independently of the the GUI
> thread.
> 
>     def progress_pulse(self):
>         if self.load_in_progress:
>             self.statusbar.progress.pulse()
>             return True                 # call again
>         else:
>             return False                # do not call again
> 
>     def on_load_data(self, list_view, alert_data, state, errno, strerror):
>         if state == 'start':
>             self.load_in_progress = True
>             self.statusbar.progress.pulse()
>             gobject.timeout_add(100, self.progress_pulse)
> 

Thanks for your advice! I tried to adjust your lines a bit, but I
was not successful:

    def progress_pulse(self):
        if self.load_in_progress:
            self.progress.pulse()
            return True                 # call again
        else:
            return False                # do not call again



    def on_load_data(self , state ):
        if state == 'start':
            self.load_in_progress = True
            self.progress.pulse()
            gobject.timeout_add(1, self.progress_pulse)
        if state == 'stop':
            self.load_in_progress = False

    def callback(self, widget, data=None):
        i=0
        n=100

        self.on_load_data('start')

        shutil.copytree(file1,"/home/fab/test_copy2")

        self.on_load_data('stop')


The progressbar starts to run, if the directory already exists and
'shutil' stops with an error message; if the copying works than
there is no progressbar movement... strange. Do you know, what I am
doing wrong?

Greetings!
Fabian



>> Greetings!
>> Fabian
>>
>> _______________________________________________
>> pygtk mailing list   pygtk@daa.com.au
>> http://www.daa.com.au/mailman/listinfo/pygtk
>> Read the PyGTK FAQ: http://www.async.com.br/faq/pygtk/

_______________________________________________
pygtk mailing list   pygtk@daa.com.au
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://www.async.com.br/faq/pygtk/

Reply via email to