Skip to content

Commit

Permalink
Fix logs view segfault on Linux
Browse files Browse the repository at this point in the history
Signed-off-by: Damien Jeandemange <[email protected]>
  • Loading branch information
jeandemanged committed Nov 25, 2024
1 parent 6ff90ee commit dc364cf
Showing 1 changed file with 33 additions and 13 deletions.
46 changes: 33 additions & 13 deletions yagat/frames/impl/logs_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,21 @@
# SPDX-License-Identifier: MPL-2.0
#
import logging
import queue
import tkinter as tk

import tksheet as tks
from pypowsybl import _pypowsybl

# we will make this configurable some day
# to be made configurable some day
MAX_LOG_ROWS = 2000

# how often we check for messages in the queue in milliseconds
_LISTEN_LOOP_MS = 100

# delay before redrawing sheet
_AFTER_REDRAW_TIME_MS = 500


class LogsView(tk.Frame, logging.Handler):

Expand All @@ -22,12 +29,13 @@ def __init__(self, parent, *args, **kwargs):
logging.Handler.__init__(self)
logger = logging.getLogger()
logger.addHandler(self)
self.sheet = tks.Sheet(self, index_align='left', after_redraw_time_ms=500)
self.sheet = tks.Sheet(self, index_align='left', after_redraw_time_ms=_AFTER_REDRAW_TIME_MS)
self.sheet.hide(canvas="top_left")
self.sheet.hide(canvas="row_index")
self.sheet.font(newfont=("Monaco", 12, "normal"))
self.sheet.font(
newfont=("Courier", 12, "normal")) # not the best monospaced font but should work on all platforms
self.sheet.set_header_data(c=0, value="Time")
self.sheet.set_column_widths([240, 90, 800])
self.sheet.set_column_widths([240, 90, 800]) # tksheet has typehint issue here but works
self.sheet.set_header_data(c=1, value="Level")
self.sheet.set_header_data(c=2, value="Message")
self.sheet['A:C'].readonly(readonly=True)
Expand All @@ -46,15 +54,27 @@ def __init__(self, parent, *args, **kwargs):
'arrowkeys',
)
self.sheet.pack(fill="both", expand=True)
self.log_queue = queue.Queue()
self.after(_LISTEN_LOOP_MS, self.listen_queue) # start listen loop
logging.info(_pypowsybl.get_version_table())

def emit(self, record):
msg = self.format(record)
self.sheet.insert_row(row=[record.asctime, record.levelname, msg], idx=0)
if record.levelname == 'WARNING':
self.sheet[0:1].highlight(bg='gold', redraw=False)
elif record.levelname == 'ERROR':
self.sheet[0:1].highlight(bg='salmon', redraw=False)
if len(self.sheet.data) > MAX_LOG_ROWS:
self.sheet.delete_row(idx=MAX_LOG_ROWS, redraw=False)
self.sheet.set_cell_size_to_text(row=0, column=2, only_set_if_too_small=True)
self.log_queue.put(record)

def listen_queue(self):
while self.log_queue.qsize():
try:
record = self.log_queue.get()
msg = self.format(record)
self.sheet.insert_row(row=[record.asctime, record.levelname, msg], idx=0)
if record.levelname == 'WARNING':
self.sheet[0:1].highlight(bg='gold', redraw=False)
elif record.levelname == 'ERROR':
self.sheet[0:1].highlight(bg='salmon', redraw=False)
if len(self.sheet.data) > MAX_LOG_ROWS:
self.sheet.delete_row(idx=MAX_LOG_ROWS, redraw=False)
self.sheet.set_cell_size_to_text(row=0, column=2, only_set_if_too_small=True)
except queue.Empty:
pass
# re-listen
self.after(_LISTEN_LOOP_MS, self.listen_queue)

0 comments on commit dc364cf

Please sign in to comment.