> Hi Trevor,
>
> Thus spoketh "Trevor J. Christensen" <[email protected]>
> unto us on Wed, 9 Feb 2011 09:54:13 -0700:
>
> > Under Windows XP, the following simple program crashes after 20
> > seconds or so with the following error:
> >
> > TclStackFree: incorrect freePtr. Call out of sequence?
> >
> > It behaves the same under python 2.6 and python 2.7.
> >
> > I suspect it has something to do with Tk/Tcl's
> multithreading model.
> > I did discover that if you comment out the vertical scrollbar code,
> > this program will run fine. I could use some help here in figuring
> > out what the problem is.
>
> The problem is that you must _n e v e r_ access the tk event
> loop from more than one thread. The best practice is to
> always run the mainloop () within the main program thread
> and, if child threads are really necessary, to use e.g.
> threading.Condition or Queue.Queue objects to handle the
> communication between Tkinter and the child thread.
>
> Regards
>
> Michael
>
Michael, thank you for your help. The following is my final solution
which works very well:
import threading, time, socket
from Tkinter import *
EVENT = '<<EVENT>>'
PORT = 12339
ADDR = ('', PORT)
BUFSIZ = 1024
class Monitor(object):
def __init__(self):
self.s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.s.settimeout(0.0) # non-blocking
self.s.bind(ADDR)
self.run()
def run(self):
while True:
try:
data, addr = self.s.recvfrom(BUFSIZ)
except socket.error, msg:
break
# I modified Tkinter.py slightly to support the 'data' key
text.event_generate(EVENT, data=data)
root.after(200, self.run) # Reschedule
def On_EVENT(*args):
event = args[0]
text.insert(END, event.data)
try: # Handle Tk vertical scroll bar bug
v = vbar.get()[1]
except ValueError:
v = 0.0
if not v < 0.95: # Support user review of history
text.see(tk.END)
text.see(END)
root = Tk()
#---------------------------------------
text = Text(root)
vbar = Scrollbar(root, orient=VERTICAL)
vbar['command'] = text.yview
text['yscrollcommand'] = vbar.set
#---------------------------------------
text.grid(column=0, row=0, sticky=NSEW)
vbar.grid(column=1, row=0, sticky=NS)
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)
#---------------------------------------
text.bind(EVENT, On_EVENT)
#---------------------------------------
worker = Monitor()
#---------------------------------------
root.mainloop()
_______________________________________________
Tkinter-discuss mailing list
[email protected]
http://mail.python.org/mailman/listinfo/tkinter-discuss