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)
            return
        else:
            self.clearData()
            self.packagename = self.package[0][1]
            self.status.set('Installing %s' % self.packagename)
            self.setIcon(self.phynchronicity_install)
            self.playSound('connect')
            self.showProgress()
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.inserturltext(line)
                self.after(5000, self.update_idletasks)

--
Kevin Walzer
Code by Kevin
http://www.codebykevin.com
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to