[pygtk] progressbar for file managing
John Dennis
jdennis at redhat.com
Tue Apr 17 02:05:40 WST 2007
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)
> Greetings!
> Fabian
>
> _______________________________________________
> pygtk mailing list pygtk at daa.com.au
> http://www.daa.com.au/mailman/listinfo/pygtk
> Read the PyGTK FAQ: http://www.async.com.br/faq/pygtk/
--
John Dennis <jdennis at redhat.com>
More information about the pygtk
mailing list