Source code for GUIBRUSHR.GUI.WIDGET.MyTable
from tkinter.ttk import Treeview
from tkinter import NO, CENTER
from typing import Any, List, Optional
[docs]
class MyTable(Treeview):
"""
A custom table widget that extends tkinter's Treeview for displaying tabular data.
This class creates a table widget with customizable columns, widths, and types.
It provides a clean interface for displaying and interacting with tabular data.
Attributes:
column_types (List[str]): List of data types for each column
"""
[docs]
def __init__(
self,
parent: Any,
table_columns: List[str],
width_columns: List[int],
list_type: Optional[List[type]] = None,
height: Optional[int] = None
) -> None:
"""
Initialize the MyTable widget.
Args:
parent: The parent widget
table_columns: List of column names
width_columns: List of column widths in pixels
list_type: List of data types for each column (defaults to all strings)
height: Height of the table in rows (None for auto-height)
"""
super().__init__(parent)
# Set default column types if not provided
if list_type is None:
list_type = [str for _ in width_columns]
# Set table height if specified
if height is not None:
self.config(height=height)
# Configure the table
self["columns"] = table_columns
# Configure the first column (tree column)
self.column("#0", width=0, stretch=NO)
self.heading("#0", text="", anchor=CENTER)
# Store column types for later validation or formatting use
self.column_types = list_type
# Configure each column
for i in range(len(table_columns)):
self.column(
table_columns[i],
anchor=CENTER,
width=width_columns[i],
)
self.heading(
table_columns[i],
text=table_columns[i],
anchor=CENTER
)
# Special handling for columns starting with "#"
if table_columns[i][0] == "#":
self.column(
table_columns[i],
width=width_columns[i],
stretch=NO
)
self.heading(table_columns[i], text="", anchor=CENTER)
# Pack the table
self.pack(fill='both', expand=True, padx=1, pady=1)
[docs]
def get_arr_values(self):
"""
Get the values of the currently selected row.
Returns:
Optional[List[Any]]: List of values in the selected row, or None if no row is selected
"""
curItem = self.focus()
if not curItem:
return None
item = self.item(curItem)
return item.get("values")