Use threads or Tkinter event loop?
Kevin Walzer
kw at codebykevin.com
Tue Mar 27 10:07:22 EDT 2007
Kevin Walzer wrote:
> I'm trying to decide whether I need threads in my Tkinter application or
> not. My app is a front end to a command-line tool; it feeds commands to
> the command-line program, then reads its output and displays it in a
> Tkinter text widget. Some of the commands are long-running and/or return
> thousands of lines of output.
>
> I initially thought I needed to use threading, because the GUI would
> block when reading the output, even when I configured the blocking to be
> non-blocking. I got threading to work, but it seemed a bit complicated.
> So, I decided to try something simpler, by using the Tkinter event loop
> to force the output to update/display.
>
> it seems to work well enough. Here is my threaded code:
>
> non-threaded:
>
> def insertDump(self):
> self.finkinstalled = os.popen('/sw/bin/fink list', 'r', os.O_NONBLOCK)
> for line in self.finkinstalled:
> self.t.insert(END, line)
> self.update()
> self.t.see(END)
>
> And here is my non-threaded code (needs two functions to work)
>
> def insertDump(self):
> try:
> data = self.dataQueue.get(block=False)
> for line in data:
> self.t.insert(END, line)
> self.t.see(END)
> self.update()
>
>
> except:
> print "error"
> raise
>
> def getDump(self):
>
> self.file = os.popen('/sw/bin/fink list', 'r', os.O_NONBLOCK)
> self.dataQueue.put(self.file)
>
> This brings me to a design, as opposed to coding, question. The
> non-threaded version seems to work just as well as the threaded one, in
> terms of speed. Moreover, it is simpler to code and debug, because I
> don't have to check to make sure the thread queue has data (I sometimes
> get an 'Empty' error message when I first start the thread). Simply
> using the Tk event loop (self.update) is also how I would have coded
> this in Tcl.
>
> So my question is this: under what circumstances in Python are threads
> considered "best practice"? Am I wrong to use the Tk event loop instead
> of threads?
>
D'oh, I got the code snippets mixed up:
non-threaded:
def insertDump(self):
self.finkinstalled = os.popen('/sw/bin/fink list', 'r', os.O_NONBLOCK)
for line in self.finkinstalled:
self.t.insert(END, line)
self.update()
self.t.see(END)
threaded:
def insertDump(self):
try:
data = self.dataQueue.get(block=False)
for line in data:
self.t.insert(END, line)
self.t.see(END)
self.update()
except:
print "error"
raise
def getDump(self):
self.file = os.popen('/sw/bin/fink list', 'r', os.O_NONBLOCK)
self.dataQueue.put(self.file)
Sorry!
--
Kevin Walzer
Code by Kevin
http://www.codebykevin.com
More information about the Python-list
mailing list