How to Build an Online Database APP by Python, PySide6 and Google Sheets (10): View Balance

Henry Wu
2 min readDec 26, 2023

Previously

This article is about how to “View Balance” in the App:

Call the function in the Main Window

  • Clears the current content in the main window.
  • Creates an instance of BalancesTable, passing google_sheets_client as a parameter.
  • Adds the BalancesTable widget to the main content area for user interaction.
    def display_balances_form(self):
self.clear_content()
balances_table = BalancesTable(self.google_sheets_client)
self.content.layout().addWidget(balances_table)

Create View Balance Class

  • __init__: Initializes the widget, sets up the Google Sheets client, and initializes the user interface.
class BalancesTable(QWidget):
def __init__(self, google_sheets_client):
super().__init__()
self.google_sheets_client = google_sheets_client
self.initUI()
  • initUI: Sets up the layout, which includes a QTableWidget for displaying balance data. The table is configured with specific columns, resizing policies, and selection behaviors.
    def initUI(self):
layout = QVBoxLayout(self)

# Create the table widget with scroll feature
self.table = QTableWidget()
self.table.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
self.desired_columns = ["Dividend Period", "First Name", "Last Name", "Balance at Start", "New Account Balance", "ID_Account","ID_Balance"]
self.table.setColumnCount(len(self.desired_columns))
self.table.setHorizontalHeaderLabels(self.desired_columns)

# Set the resize mode for each column
for i in range(len(self.desired_columns)):
self.table.horizontalHeader().setSectionResizeMode(i, QHeaderView.ResizeToContents)

self.table.horizontalHeader().setStretchLastSection(True)
self.table.verticalHeader().setDefaultSectionSize(30)
self.table.verticalHeader().setSectionResizeMode(QHeaderView.Fixed)
self.table.setEditTriggers(QTableWidget.NoEditTriggers)
self.table.setSelectionBehavior(QTableWidget.SelectRows)

# Load the data into the table
self.loadData()

layout.addWidget(self.table)
  • loadData: Loads balance data from the Google Sheets worksheet named "05_Balances". It filters the data for the current quarter, sorts it, and populates the table.
    def loadData(self):
current_quarter = self.get_current_quarter()

worksheet = self.google_sheets_client.open_spreadsheet(GOOGLESHEET_ID).worksheet("05_Balances")
all_data = worksheet.get_all_values()
headers = all_data[0]
dividend_period_index = headers.index("Dividend Period")
id_balance_index = headers.index("ID_Balance")

# Filter the data for the current quarter
filtered_data = [row for row in all_data[1:] if row[dividend_period_index] == current_quarter]

# Sort the filtered data in reverse order based on "ID_Balance"
sorted_data = sorted(filtered_data, key=lambda x: x[id_balance_index], reverse=True)

# Map column names to indices
column_indices = {name: index for index, name in enumerate(headers)}

# Prepare rows to be displayed in the table
display_rows = []
for row in sorted_data:
display_row = [row[column_indices[col]] for col in self.desired_columns if col in column_indices]
display_rows.append(display_row)

self.table.setRowCount(len(display_rows))

boldFont = QFont()
boldFont.setBold(True)

# Set column header font to bold
for i in range(len(self.desired_columns)):
header = self.table.horizontalHeaderItem(i)
if header:
header.setFont(boldFont)

# Align content to center and set rows
for i, row in enumerate(display_rows):
for j, cell in enumerate(row):
item = QTableWidgetItem(cell)
item.setTextAlignment(Qt.AlignCenter) # Align text to center
self.table.setItem(i, j, item)
  • get_current_quarter: Calculates and returns the current quarter of the year. This method is used to filter the balance data relevant to the current period.
    def get_current_quarter(self):
month = datetime.now().month
quarter = ((month - 1) // 3) + 1
year = datetime.now().year
return f"{year}Q{quarter}"

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

Henry Wu
Henry Wu

Written by Henry Wu

Indie Developer/ Business Analyst/ Python/ AI/ Former Journalist/ Codewriter & Copywriter

No responses yet

Write a response