1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| from Tkinter import *
import sys
import threading
# c'est pas plus simple, juste mnemotechnique
get_current_tid = lambda: threading.current_thread().ident
class Command(object):
'''wraps call into message'''
def __init__(self, method, *args, **kwds):
self._method = method
self._args = args
self._kwds = kwds
def do(self):
try:
rs = self._method(*self._args, **self._kwds)
except Exception as e:
print 'exception ', e
return
return rs
class LogView(Frame):
_max_lines=10
_remove_chunk = 5
def __init__(self, master=None):
Frame.__init__(self, master)
self._scrollbar = Scrollbar(self)
self._scrollbar.pack(side=RIGHT, fill=Y)
self._text = Text(self)
self._text.pack()
self.pack()
self._line_count = 0
self._delete_args = ("1.0", "%d.0" % self._remove_chunk)
def add_line(self, line):
'''if called from a different thread, submit as a message'''
if get_current_tid() != self.master._tid: #assume master is root!
self.after_idle(Command(self.add_line, line).do)
return
self._line_count += 1
self._text.insert(INSERT, line + '\n')
if self._line_count > self._max_lines:
self._text.delete(*self._delete_args)
self._line_count -= (self._remove_chunk - 1)
class TkApplication(Tk):
_height = 200
_width = 200
def __init__(self, title):
Tk.__init__(self)
self.title(title)
self.geometry('%dx%d' % (self._height, self._width))
self.protocol("WM_DELETE_WINDOW", self.on_delete_window)
self._quit_event = False
self._tid = get_current_tid()
def on_delete_window(self):
self._quit_event = True
sys.exit() |
Partager