I have a ScrolledText widget where I output all my log messages. Since there are a lot, and this program runs for hours, it gets overloaded.
I need a way of limiting the number of lines, say to 400 lines.
I've tried to clear text like this:
self.mytext.delete(1.0, END)
But it doesn't do anything.
Heres my setup:
class XStatusFrame:
def __init__(self, master, window):
self.frame = Frame(master, relief="raised", width=950)
self.frame.grid(row=4,column=0,sticky=(E,W),columnspan=20,rowspan=2)
self.clear_btn = Button(self.frame,text="Clear Log", command=lambda: self.clear_log())
self.clear_btn.pack(side=TOP, anchor=W)
# text widget
self.mytext = ScrolledText(self.frame, undo=True,state="disabled", fg="white", bg="black")
#self.mytext = Text(self.frame, state="disabled", fg="white", bg="black")
self.mytext.pack(fill=X)
# Create textLogger
text_handler = TextHandler(self.mytext)
# Add the handler to logger
self.logger = logging.getLogger()
self.logger.addHandler(text_handler)
def clear_log(self):
self.mytext.delete(1.0, END)
class TextHandler(logging.Handler):
def __init__(self, text):
# run the regular Handler __init__
logging.Handler.__init__(self)
# Store a reference to the Text it will log to
self.text = text
def num_lines(self):
return int(self.text.index('end').split('.')[0]) - 1
def emit(self, record):
msg = self.format(record)
def append():
self.text.configure(state='normal')
self.text.insert(END, "["+self.timestamp()+"]["+str(self.num_lines())+"] "+msg + '\n')
self.text.configure(state='disabled')
# Autoscroll to the bottom
self.text.yview(END)
# This is necessary because we can't modify the Text from other threads
self.text.after(0, append)
# MY Try at limiting number of lines, which doesnt work...
if self.num_lines() > 5:
self.text.delete("1.0", END)
def timestamp(self):
ts = time.time()
return datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')