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
_______________________________________________
pygtk mailing list   pygtk@daa.com.au
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://faq.pygtk.org/

Reply via email to