console.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import queue
  2. import tkinter as tk
  3. from tkinter import E, N, S, W, ttk
  4. from tkinter.scrolledtext import ScrolledText
  5. from PIL import Image, ImageTk
  6. class ConsoleUi:
  7. """Poll messages from a logging queue and display them in a scrolled text
  8. widget"""
  9. def __init__(self, frame, q, qh):
  10. self.frame = frame
  11. self.log_queue = q
  12. self.queue_handler = qh
  13. trash_icon = Image.open('img/icons/icons8-eliminar-16.png')
  14. self.trash_icon = ImageTk.PhotoImage(trash_icon)
  15. # Create a ScrolledText wdiget
  16. self.scrolled_text = ScrolledText(frame, state='disabled', height=25)
  17. self.scrolled_text.grid(row=0, column=0, sticky=(N, S, W, E))
  18. self.clear = ttk.Button(frame, text='Limpiar Log',
  19. command=self.clear_console,
  20. image=self.trash_icon,
  21. compoun='right')
  22. self.clear.grid(row=1, column=0, sticky=E, pady=(5, 5))
  23. # Font config
  24. self.scrolled_text.configure(font='TkFixedFont')
  25. self.scrolled_text.tag_config('INFO', foreground='black')
  26. self.scrolled_text.tag_config('DEBUG', foreground='gray')
  27. self.scrolled_text.tag_config('WARNING', foreground='orange')
  28. self.scrolled_text.tag_config('ERROR', foreground='red')
  29. self.scrolled_text.tag_config(
  30. 'CRITICAL', foreground='red', underline=1)
  31. # Create a logging handler using a queue
  32. # self.queue_handler = QueueHandler(self.log_queue)
  33. # formatter = logging.Formatter(
  34. # '%(asctime)s: %(message)s', datefmt='%Y-%m-%dT%H:%M:%S')
  35. # self.queue_handler.setFormatter(formatter)
  36. # # self.queue_handler.setLevel(logging.INFO)
  37. # logger.addHandler(self.queue_handler)
  38. # Start polling messages from the queue
  39. self.frame.after(100, self.poll_log_queue)
  40. def display(self, record):
  41. msg = self.queue_handler.format(record)
  42. self.scrolled_text.configure(state='normal')
  43. self.scrolled_text.insert(tk.END, msg + '\n', record.levelname)
  44. self.scrolled_text.configure(state='disabled')
  45. # Autoscroll to the bottom
  46. self.scrolled_text.yview(tk.END)
  47. def poll_log_queue(self):
  48. # Check every 100ms if there is a new message in the queue to display
  49. while True:
  50. try:
  51. record = self.log_queue.get(block=False)
  52. except queue.Empty:
  53. break
  54. else:
  55. self.display(record)
  56. self.frame.after(100, self.poll_log_queue)
  57. def clear_console(self):
  58. self.scrolled_text.configure(state='normal')
  59. self.scrolled_text.delete(1.0, tk.END)
  60. self.scrolled_text.configure(state='disabled')