Keeping a Tkinter GUI alive during a long running process

K

Kevin Walzer

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)
 
G

Grant Edwards

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.

Isn't there a way in Tkinter to have a file descriptor produce an
event whenever it becomes readble?

http://stackoverflow.com/questions/...inter-repond-events-while-waiting-socket-data
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,582
Members
45,057
Latest member
KetoBeezACVGummies

Latest Threads

Top