Archived
1
1
Fork 0

tui: efficiency; use new Log widget instead of TextLog. remove yml req

This commit is contained in:
Josh Lay 2023-08-05 23:02:22 -05:00
parent 4c706fec35
commit a06778858d
Signed by: jlay
GPG key ID: B265E45CACAD108A

View file

@ -16,7 +16,6 @@ Functions:
# pylint: disable=line-too-long # pylint: disable=line-too-long
from datetime import datetime from datetime import datetime
from typing import Optional from typing import Optional
from yaml import dump
from rich.text import Text from rich.text import Text
from textual import work from textual import work
@ -32,7 +31,7 @@ from textual.widgets import (
Static, Static,
TabbedContent, TabbedContent,
TabPane, TabPane,
TextLog, Log,
) )
from .utils import ( from .utils import (
@ -129,8 +128,7 @@ class GPUStatsWidget(Static):
def __init__(self, *args, cards=None, **kwargs): def __init__(self, *args, cards=None, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.cards = cards self.cards = cards
self.text_log = TextLog(highlight=True, self.text_log = Log(highlight=True,
markup=True,
name='log_gpu', name='log_gpu',
classes='logs') classes='logs')
self.stats_table = DataTable(zebra_stripes=True, self.stats_table = DataTable(zebra_stripes=True,
@ -142,18 +140,17 @@ class GPUStatsWidget(Static):
def on_mount(self) -> None: def on_mount(self) -> None:
'''Fires when stats widget 'mounted', behaves like on first showing''' '''Fires when stats widget 'mounted', behaves like on first showing'''
self.update_log("[bold green]App started, logging begin!\n") self.update_log("App started, logging begin!")
# construct the table columns # construct the table columns
columns = list(self.get_column_data_mapping(None).keys()) columns = list(self.get_column_data_mapping(None).keys())
self.update_log('Stat columns:')
for column in columns: for column in columns:
self.update_log(f" - '{column}'", show_ts=False)
if column in ['Limit', 'Default', 'Capability']: if column in ['Limit', 'Default', 'Capability']:
self.stats_table.add_column(label='[italic]' + column, self.stats_table.add_column(label='[italic]' + column,
key=column) key=column)
else: else:
self.stats_table.add_column(label=column, key=column) self.stats_table.add_column(label=column, key=column)
# self.update_log(f' - "{column}"')
self.update_log('[bold]Stat columns:')
self.update_log(dump(data=columns, default_flow_style=False, sort_keys=True))
# do a one-off stat collection, populate table before the interval # do a one-off stat collection, populate table before the interval
self.get_stats() self.get_stats()
# stand up the stat-collecting interval, twice per second # stand up the stat-collecting interval, twice per second
@ -176,9 +173,19 @@ class GPUStatsWidget(Static):
with TabPane("Logs", id="tab_logs"): with TabPane("Logs", id="tab_logs"):
yield self.text_log yield self.text_log
def update_log(self, message: str) -> None: def update_log(self, message: str, show_ts: bool = True) -> None:
"""Update the TextLog widget with a new message.""" """Update the Log widget with a new message.
self.text_log.write(message)
Highest Textual version-requiring widget; >=0.32.0
Should be more performant than the old TextLog widget
Args:
message (str): The message to be added to the logging widget on the 'Logs' tab.
show_ts (bool, optional): If True (default), appends a timestamp to the message.
"""
if show_ts:
message = f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] {message}"
self.text_log.write_line(message)
@work(exclusive=True) @work(exclusive=True)
async def get_stats(self): async def get_stats(self):