Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Use threads or Tkinter event loop?

Reply
Thread Tools

Use threads or Tkinter event loop?

 
 
Kevin Walzer
Guest
Posts: n/a
 
      03-27-2007
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?

--
Kevin Walzer
Code by Kevin
http://www.codebykevin.com
 
Reply With Quote
 
 
 
 
Kevin Walzer
Guest
Posts: n/a
 
      03-27-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
 
Reply With Quote
 
 
 
 
kyosohma@gmail.com
Guest
Posts: n/a
 
      03-27-2007
On Mar 27, 9:07 am, Kevin Walzer <(E-Mail Removed)> wrote:
> 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 Kevinhttp://www.codebykevin.com


It looks like Tkinter is similar to wxPython in that you're not
supposed to use the mainloop for anything except the GUI and GUI
commands. The following websites have more info on Tkinter and
threads:

http://aspn.activestate.com/ASPN/Coo...n/Recipe/82965
http://www.thescripts.com/forum/thread22536.html
http://forums.devshed.com/python-pro...ds-123001.html

I use the Threading module for threading in wxPython. I think that
would probably serve you well with Tkinter as well. You can use the
join() method to wait for all the threads to exit.

Mike

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
TkInter bind() event is not firing event trigger Anthony Papillion Python 3 06-23-2010 12:55 AM
TB View, Threads, Threads with unread The Invisible Man Firefox 1 03-20-2006 02:09 AM
Standard Threads vs Weightless Threads yoda Python 2 08-01-2005 09:12 PM
threads without threads sindica@gmail.com C Programming 4 08-27-2004 09:25 PM
Only One Tkinter Entry can receive key event event in Linux RH8.0 wang xiaoyu Python 0 06-25-2003 04:44 AM



Advertisments