Pythonを使用したリアルタイムの画面表示を更新したい

実現したいこと

開発環境はPython3を使用しており、データベースはPostgresqlです。
PCはwindows10 64ビットを使用しています。

データベースから読み込んできた値を、画面にテーブル形式で表示したいです。
テーブルに表示するところまでは完成したのですが、データベース側の値が変わっても画面が更新されません。データベース側の値が変わったら、それに伴い画面表示も更新したいです。

発生している問題・分からないこと

プログラムを実行しても特にエラーはでていません。
プログラムを実行すると、今現在のデータベースの値は問題なく画面上にテーブルで表示されますが
その後、データベース側の値が変更されても画面上に反映はされません。原因が分かりません。

プログラムのコードを一部マスクをしています(※で記載)

該当のソースコード

Python3

1import sys 2import time 3from PyQt5.QtCore import QTimer 4import os 5os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = 'C:\\Users\\※\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\PyQt5\\Qt5\\plugins' 6from PyQt5 import QtCore as qtc 7from PyQt5 import QtGui as qtg 8from PyQt5 import QtSql as qts 9from PyQt5 import QtWidgets as qtw 10 11class MainWindow(qtw.QWidget): 12 13 def __init__(self): 14 super().__init__() 15 # 画面タイトルの設定 16 self.setWindowTitle("名簿表示") 17 # 画面サイズの設定 18 self.resize(640, 500) 19 # DB接続 20 self.db = None 21 # レイアウト 22 layout = qtw.QVBoxLayout() 23 self.setLayout(layout) 24 # データベース接続 25 self.db_connect() 26 # 必要テーブルの存在チェック 27 required_tables = {"ID"} 28 self.table_check(required_tables) 29 # モデル(QSqlQueryModel)の作成 30 self.product_info_model = qts.QSqlQueryModel() 31 # モデルが取得するクエリを設定 32 self.product_info_model.setQuery( 33 "select ※,※ from public.\"ID\"" 34 ) 35 # 列名を設定 36 column_names = ["ID", "番号"] 37 self.set_column_names(column_names) 38 # ビュー(QTableView)を作成 39 self.product_list_view = qtw.QTableView() 40 # 作成したモデルを設定 41 self.product_list_view.setModel(self.product_info_model) 42 # ビューをレイアウトに追加 43 self.layout().addWidget(self.product_list_view) 44 # 画面表示 45 self.show() 46 def db_connect(self): 47 """DB接続""" 48 # PostgreSQLデータベースへの接続 49 self.db = qts.QSqlDatabase.addDatabase("QPSQL") 50 print(f"DBドライバー一覧: {self.db.drivers()}") 51 self.db.setDatabaseName("※") 52 self.db.setHostName("localhost") 53 self.db.setPort(5432) 54 self.db.setUserName("postgres") 55 self.db.setPassword("※") 56 # データベースをオープンし、エラーの場合は終了する 57 if not self.db.open(): 58 error = self.db.lastError().text() 59 qtw.QMessageBox.critical( 60 None, 61 "DB接続エラー", 62 "データベースファイルを開けませんでした。", 63 ) 64 sys.exit(1) 65 def table_check(self, required_tables): 66 """テーブルが対象DBに存在するかをチェックする 67 Args: 68 required_tables: 必要テーブルの集合(set) 69 """ 70 # データベースの情報を取得して対象テーブルが存在するかチェックする 71 tables = self.db.tables() 72 print(f"テーブル一覧: {tables}") 73 missing_tables = required_tables - set(tables) 74 if missing_tables: 75 qtw.QMessageBox.critical( 76 None, 77 "DB存在確認エラー", 78 f"必要なデータが存在しません: {missing_tables}", 79 ) 80 sys.exit(1) 81 def set_column_names(self, columns): 82 """列名設定 83 Args: 84 columns: 列名リスト 85 """ 86 for i, name in enumerate(columns): 87 self.product_info_model.setHeaderData( 88 i, qtc.Qt.Orientation.Horizontal, name 89 ) 90 91 t1 = QTimer() 92 t1.timeout.connect(self.set_column_names) #実行する関数を指定 93 t1.setInterval(10000) #割り込み周期をms単位で指定 94 t1.start() 95 96def main(): 97 """メイン関数""" 98 app = qtw.QApplication(sys.argv) 99 mv = MainWindow() 100 sys.exit(app.exec()) 101if __name__ == "__main__": 102 main()

試したこと・調べたこと

上記の詳細・結果

本文(プログラム内)の
def set_column_names(self, columns):   の部分がデータベースの列の値を読み込んでくるところになります。ここの部分に

いったんリストを全削除するようなコードを記載→それからfor文でデータベースの列の値を読んでくる
→Qtimerで10秒後に再び、set_column_names関数を実行してこれまでのリストを削除して
再びfor文でデータベースの列の値を読んでくる ・・・・ このループ処理

この挙動で実現したいことを再現できるのではないかと思ったのですが
コードをどのように記載すればいいのか。また考え方としてこの方法が合っているのか
分かりませんでした。ご教示いただけますと幸いです。

補足

特になし

コメントを投稿

0 コメント