89 lines
2.7 KiB
Python
89 lines
2.7 KiB
Python
import time
|
|
import threading
|
|
import logging
|
|
try:
|
|
import tkinter as tk # Python 3.x
|
|
import tkinter.scrolledtext as ScrolledText
|
|
except ImportError:
|
|
import Tkinter as tk # Python 2.x
|
|
import ScrolledText
|
|
|
|
class TextHandler(logging.Handler):
|
|
# This class allows you to log to a Tkinter Text or ScrolledText widget
|
|
# Adapted from Moshe Kaplan: https://gist.github.com/moshekaplan/c425f861de7bbf28ef06
|
|
|
|
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 emit(self, record):
|
|
msg = self.format(record)
|
|
def append():
|
|
self.text.configure(state='normal')
|
|
self.text.insert(tk.END, msg + '\n')
|
|
self.text.configure(state='disabled')
|
|
# Autoscroll to the bottom
|
|
self.text.yview(tk.END)
|
|
# This is necessary because we can't modify the Text from other threads
|
|
self.text.after(0, append)
|
|
|
|
class myGUI(tk.Frame):
|
|
|
|
# This class defines the graphical user interface
|
|
|
|
def __init__(self, parent, *args, **kwargs):
|
|
tk.Frame.__init__(self, parent, *args, **kwargs)
|
|
self.root = parent
|
|
self.build_gui()
|
|
|
|
def build_gui(self):
|
|
# Build GUI
|
|
self.root.title('TEST')
|
|
self.root.option_add('*tearOff', 'FALSE')
|
|
self.grid(column=0, row=0, sticky='ew')
|
|
self.grid_columnconfigure(0, weight=1, uniform='a')
|
|
self.grid_columnconfigure(1, weight=1, uniform='a')
|
|
self.grid_columnconfigure(2, weight=1, uniform='a')
|
|
self.grid_columnconfigure(3, weight=1, uniform='a')
|
|
|
|
# Add text widget to display logging info
|
|
st = ScrolledText.ScrolledText(self, state='disabled')
|
|
st.configure(font='TkFixedFont')
|
|
st.grid(column=0, row=1, sticky='w', columnspan=4)
|
|
|
|
# Create textLogger
|
|
text_handler = TextHandler(st)
|
|
|
|
# Logging configuration
|
|
logging.basicConfig(filename='test.log',
|
|
level=logging.INFO,
|
|
format='%(asctime)s - %(levelname)s - %(message)s')
|
|
|
|
# Add the handler to logger
|
|
logger = logging.getLogger()
|
|
logger.addHandler(text_handler)
|
|
|
|
def worker():
|
|
# Skeleton worker function, runs in separate thread (see below)
|
|
while True:
|
|
# Report time / date at 2-second intervals
|
|
time.sleep(2)
|
|
timeStr = time.asctime()
|
|
msg = 'Current time: ' + timeStr
|
|
logging.info(msg)
|
|
|
|
def main():
|
|
|
|
root = tk.Tk()
|
|
myGUI(root)
|
|
|
|
t1 = threading.Thread(target=worker, args=[])
|
|
t1.start()
|
|
|
|
root.mainloop()
|
|
t1.join()
|
|
|
|
main()
|