Bou Baris wrote: > I'm a new user of PyGTK. > I'm writing with Python and PyGTK a little software for decoding MKV > video files using external tool MKV TOOL UNIX. It's a simple graphical > front-end to ffmpeg and MKVTOOLNIX. > I use Ubuntu 9.04 shipped with Python 2.6.2 and PyGTK 2.x > > I've a problem (obviously). > > I've made a non blocking function (using subprocess.Popen and select) > for calling the external program MKVEXTRACT. When works, 'mkvextract' > reports its progress state as a percentage: > Progress: 0% > Progress: 1% > Progress: 2% > .... > > I want read 'mkvextract' stdout in a real-time (non-blocking) fashion, > decode progress number from string 'Progress: xx%' and control a PyGTK > ProgressBar. > > > This is the code and non-blocking is working (printing the progress to > console it's ok). > The problem is that when code run, I see in terminal the percentage > number decoded correctly (printed from my code, not by 'mkvextract', > see code below) but progress bar isn't moving. > Really ALL GUI is blocked. > It's look that Popen block GUI job until 'mkvextraxt' end. > When Popen/mkvextract ends its job, GUI restart to normal behaviour > and I see the progress bar to 100% > > > def mkv_dts_extraction(self,dtstrack,pgbar=None): > > command=[ 'mkvextract', \ > 'tracks', \ > self.INPUTFILE, \ > dtstrack + ':' + self.DTSFILENAME ] > > # start subprocess > proc = subprocess.Popen(command,stdout=subprocess.PIPE) > > # set non-blocking mode > outfile = proc.stdout > outfd = outfile.fileno() > file_flags = fcntl.fcntl(outfd, fcntl.F_GETFL) > fcntl.fcntl(outfd, fcntl.F_SETFL, file_flags | os.O_NDELAY) > > # use 'select' for reading > while True: > ready = select.select([outfd],[],[]) # wait for input > if outfd in ready[0]: > outchunk = outfile.read() > if outchunk == '' : > break > select.select([],[],[],.1) # give a little time for buffers to > fill > > perc = > re.compile("Progress:\s+(\d+)",re.IGNORECASE).findall(outchunk) > if len(perc) > 0: > completed = int(perc[len(perc)-1]) / 100.00 # take > last 'Progress' number > > print completed # this print WORKS: in terminal I can > see the percentage growing > > # progress bar DON'T WORK : GUI is blocked > pgbar.set_fraction(completed) > pgbar.show() > > err = proc.wait() > > return True > Instead of using select() use gobject.io_add_watch() on proc.stdout to register a callback function that is used to read the % and set the progress bar.
John _______________________________________________ pygtk mailing list pygtk@daa.com.au http://www.daa.com.au/mailman/listinfo/pygtk Read the PyGTK FAQ: http://faq.pygtk.org/