Keeping a Tkinter GUI alive during a long running process

Kevin Walzer kw at
Fri Dec 21 04:04:18 CET 2012

I maintain a Tkinter application that's a front-end to to a package 
manger, and I have never been able to find a way to keep the app from 
locking up at some point during the piping in of the package manager's 
build output into a text widget. At some point the buffer is overwhelmed 
and the app simply can't respond anymore, or writes data to the text 
widget after locking up for a period.

I've long used the typical Tkinter design pattern of opening a pipe to 
the external command, and letting it do its thing. However, after a 
time, this locks up the app. If I try to throttle the buffer with some 
combination of "update" or "after" or "update_idletasks," that keeps the 
data flowing, but it comes in too slowly and keeps flowing in long after 
the external process has terminated.

Below is a sample function that illustrates how I approach this issue. 
Can someone suggest a better approach?

  #install a fink package
     def installPackage(self):

         self.package = self.infotable.getcurselection()
         if not self.package:
             showwarning(title='Error', message='Error', detail='Please 
select a package name.', parent=self)
             self.packagename = self.package[0][1]
             self.status.set('Installing %s' % self.packagename)
             self.file = Popen('echo %s | sudo -S %s -y install %s' % 
(self.passtext, self.finkpath.get(), self.packagename), shell=True, 
bufsize=0, stdout=PIPE).stdout
             for line in self.file:
                 self.after(5000, self.update_idletasks)

Kevin Walzer
Code by Kevin

More information about the Python-list mailing list