Как Python PyQt5 Обновление данные?
Я понимаю что тема очень заезженная, НО если есть возможность помогите — не могу понять почему при нажатии кнопок не обновляются данные окна. Кто может прочитать мой код и подсказать где ошибка Программа берет данные и вставляет их в таблицу мой код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import * from PyQt5.QtGui import * import time from PyQt5 import QtCore from PyQt5.QtCore import * from PyQt5.QtWidgets import QApplication, QTableView from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * import pymysql.cursors import pymysql pymysql.install_as_MySQLdb() import MySQLdb from PyQt5.QtCore import Qt from PyQt5.QtWidgets import (QApplication, QDialog, QDialogButtonBox, QHBoxLayout, QMessageBox, QPushButton, QTableView) from PyQt5.QtSql import QSqlTableModel from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QApplication, QTableView from PyQt5.QtSql import QSqlTableModel try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: def _fromUtf8(s): return s class Widget(QtWidgets.QWidget): def __init__(self): super().__init__() self.starw() def starw(self): self.window_height = 300 self.window_width = 600 self.setFixedSize(self.window_height, self.window_width) self.setWindowIcon(QIcon('logo1.png')) self.setWindowTitle("Teco monitoring") layout = QtWidgets.QVBoxLayout(self) btn_layout = QtWidgets.QHBoxLayout() btn1 = QtWidgets.QPushButton("Previous") btn2 = QtWidgets.QPushButton("Quit") btn3 = QtWidgets.QPushButton("Next") btn_layout.addWidget(btn1) btn_layout.addWidget(btn2) btn_layout.addWidget(btn3) btn1.clicked.connect(self.minus) btn2.clicked.connect(QCoreApplication.instance().quit) btn3.clicked.connect(self.plus) table = QtWidgets.QTableWidget() table.setRowCount(6) table.setColumnCount(2) table.setHorizontalHeaderLabels(["Mark", "Devise"]) table.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) layout.addWidget(table) layout.addLayout(btn_layout) self.baza(table) def baza(self, table): self.kolstrok = 1 self.kolst() db = MySQLdb.connect("", "", "", "") cursor = db.cursor() cursor.execute("select * from _data_in_memory WHERE device_id=" + str(self.kolstrok)) for dan in cursor.fetchall(): table.setItem(0, 0, QTableWidgetItem("IP")) table.setItem(0, 1, QTableWidgetItem(str(dan[0]))) table.setItem(1, 0, QTableWidgetItem("Titul")) table.setItem(1, 1, QTableWidgetItem(str(self.kolstrok))) table.setItem(2, 0, QTableWidgetItem("Model")) table.setItem(2, 1, QTableWidgetItem(dan[2])) table.setItem(3, 0, QTableWidgetItem("Mame")) table.setItem(3, 1, QTableWidgetItem(dan[3])) table.setItem(4, 0, QTableWidgetItem("Regoin")) table.setItem(4, 1, QTableWidgetItem(dan[4])) table.setItem(5, 0, QTableWidgetItem("Adres")) table.setItem(5, 1, QTableWidgetItem(dan[5])) def kolst(self): db = MySQLdb.connect("", "", "", "") self.kolstrok = 1 cursor = db.cursor() cursor.execute("select count(*) from list_device") self.kolnew = str(cursor.fetchone()[0]) def plus(self): self.kolstrok = str(self.kolstrok + 1) if (self.kolstrok > str(self.kolnew)): self.kolstrok = 1 else: self.kolstrok = 2 self.baza() def minus(self): self.kolstrok = str(self.kolstrok - 1) if (self.kolstrok == 0): self.kolstrok = 1 self.baza() if __name__ == '__main__': app = QtWidgets.QApplication([]) w = Widget() w.show() app.exec()
Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Как установить PyQt5 для Python 3.6.3
Всем привет!Сколько не перелазил интернет — нормальной инструкции по установке PyQt5.9 для Python.
Python PyQt5 GUI как обновлять текст?
Как в PyQt5 обновить текст в QLabel во время выполнения программы? label = "Test" self.title =.
Как в IDLE (Python 3.6 32-bit) подключить PyQt5?
Установил PyQt5-5.6-gpl-Py3.5-Qt5.6.0-x32-2 Пытаюсь привязать библиотеку Qt5QuickWidgets к.
Как из виджета PyQt5 подавать команды на консоль Python 3.6?
Всем привет! Появилась потребность, помимо просмотра вывода из консоли Python Shell в виджете.
Как закрепить действие на конкретную кнопку в Python? (PyQT5 — Дизайн)
Всем привет, создал дизайн в qt designer. main.py import sys import model from PyQt5 import.
1287 / 672 / 365
Регистрация: 07.01.2019
Сообщений: 2,208
Сообщение было отмечено dima7512963 как решение
Решение
В строке 62 функция вызывается так
self.baza(table)
а в функциях так
self.baza()
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Не могу установить библиотеку pyqt5-tools python не получается через терминал и настройки и python itnerpritathor
Прошу помочь
Порт pyqt5 (python 3.5) программы на android — Python
Подскажите пожалуйста возможно ли программу написанную на python методами pyqt5 переделать под.
Обновление главного окна в PyQt5
Доброго Всем времени суток. Наверное уже не раз создавались подобные темы, но ответа на свой вопрос.
PyQt5 python 3.4.1
Приветствую всех и прошу помощи! нужна программа в которой 4 строчки куда заносятся переменные.
PYQT5 designer Python 3.5
Доброго времени суток! Нуждаюсь в подсказке через PYQT5 designer создал окно с виджетами.
Paint в PYqt5 PYTHON
Помогите пожалуйста! Делаю рисовалку, уже сделал кисти, но не могу сделать инструмент фигуры.
Python-сообщество
- Начало
- » GUI
- » Как обновлять qtablewidget при добавлении новой строки
#1 Май 11, 2016 23:19:11
sumarokov_denis Зарегистрирован: 2016-05-11 Сообщения: 5 Репутация: 0 Профиль Отправить e-mail
Как обновлять qtablewidget при добавлении новой строки
Подскажите пожалуйста, стоит признаться в достаточно скромных познаниях в PyQt5.
Мне необходимо реализовать в моем приложении возможность добавления строки в Qtablewidget. Таблица строится из массива, при при нажатии на кнопку, вызывается qinputdialog, и данные из него добавляются в массив а далее должны отображаться в в таблице. Но не получается. Нужно емитировать какой то сигнал? либо как то перестроить заново таблицу??
Как будет правильнее! Опытные люди — подскажите! Очень надо, уж столько времени потрачено, а прогресса нет
#!/usr/bin/python3 # -*- coding: utf-8 -*- import json import random from threading import Thread from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QWidget, QApplication, QGridLayout, QLabel, QTableWidget, QPushButton, QTableWidgetItem, \ QDialog, QMessageBox, QInputDialog import sys import requests import time from login_dialog import Ui_Dialog class Ebo(QWidget): def __init__(self): super().__init__() self.login_status = False self.initUI() def initUI(self): self.data = self.load_data() self.user_list = self.take_user_list() self.setGeometry(300, 300, 925, 738) grid = QGridLayout() self.setLayout(grid) self.label = QLabel() self.label.setText('Метка') grid.addWidget(self.label, 0, 0, 1, 1) self.pushButton = QPushButton() self.pushButton.setText('Login') grid.addWidget(self.pushButton, 0, 1, 1, 1) self.label_2 = QLabel() self.label_2.setText("label_2") grid.addWidget(self.label_2, 1, 0, 1, 1) self.label_3 = QLabel() self.label_3.setText("label_3") grid.addWidget(self.label_3, 1, 1, 1, 1) self.create_user_list_table() grid.addWidget(self.tableWidget, 2, 0, 1, 2) self.tableWidget_2 = QTableWidget() self.tableWidget_2.setObjectName("tableWidget_2") self.tableWidget_2.setColumnCount(4) self.tableWidget_2.setRowCount(1) self.tableWidget_2.horizontalHeader().setStretchLastSection(True) grid.addWidget(self.tableWidget_2, 5, 0, 1, 2) self.pushButton_3 = QPushButton() self.pushButton_3.setText("Add account") grid.addWidget(self.pushButton_3, 4, 1, 1, 1) self.pushButton_2 = QPushButton() self.pushButton_2.setText("Dellete account") grid.addWidget(self.pushButton_2, 4, 0, 1, 1) self.pushButton_4 = QPushButton() self.pushButton_4.setText("Make xls for all") grid.addWidget(self.pushButton_4, 6, 0, 1, 1) self.pushButton_5 = QPushButton() self.pushButton_5.setText("Make xls for this") grid.addWidget(self.pushButton_5, 6, 1, 1, 1) self.dialog = self.dialog_setup() self.login_inst = False self.pushButton.clicked.connect(self.test_one) self.pushButton_3.clicked.connect(self.add_acc) self.pushButton.clicked.connect(self.test_one) self.show() def take_user_list(self): try: return self.data['user_list'] except: return [] def add_acc(self): new_acc = self.show_cr_dial() try: self.data['user_list'].append(new_acc) except: user_list = [] user_list.append(new_acc) self.data['user_list'] = user_list self.create_user_list_table() def load_data(self): try: with open('data.json', 'r') as fp: data = json.load(fp) return data except: data = 'last_run':time.time()> with open('data.json', 'w') as fp: json.dump(data, fp) return data def save_data(self, data): with open('data.json', 'w') as fp: json.dump(data, fp) def get_user_list(self): user_list = ['nelliaksenova', 'lina_belova', 'kosmetika_tai_39'] return user_list def create_user_list_table(self): self.tableWidget = QTableWidget() self.tableWidget.setObjectName("tableWidget") self.tableWidget.setColumnCount(5) self.tableWidget.setColumnWidth(0, 250) self.tableWidget.setColumnWidth(1, 150) self.tableWidget.setColumnWidth(2, 150) self.tableWidget.setColumnWidth(3, 150) users = len(self.user_list) self.tableWidget.setRowCount(users) self.tableWidget.horizontalHeader().setStretchLastSection(True) row = 0 column = 0 for us in self.user_list: item = QTableWidgetItem(us) self.tableWidget.setItem(row, column, item) row +=1 def show_cr_dial(self): text, ok = QInputDialog.getText(self, 'Create account', 'Enter account name:') if ok: return str(text) def closeEvent(self, event): self.save_data(self.data) reply = QMessageBox.question(self, 'Message', "Are you sure to quit?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: event.accept() else: event.ignore() def keyPressEvent(self, e): if e.key() == Qt.Key_Q: self.setGeometry(300, 300, 450, 250) def showLoginDialog(self): pass def test_one(self): if self.dialog.exec_(): self.login, self.passwd = self.ui.get_val() self.login_instagram() def finder(self,txt): text = txt finder_text_start = ('' all_data_start = text.find(finder_text_start) all_data_end = text.find(finder_text_end, all_data_start + 1) json_str = text[(all_data_start + finder_text_start_len + 1) : all_data_end] all_data = json.loads(json_str) return all_data def login(self): pass def dialog_setup(self): dialog = QDialog() self.ui = Ui_Dialog() self.ui.setupUi(dialog) return dialog def start_thread(self): t = Thread(target=self.load_media) t.daemon = True t.start() def load_media(self): pass if __name__ == '__main__': app = QApplication(sys.argv) ex = Ebo_instagram() sys.exit(app.exec_())
Обновить QTableView при добавлении данных в таблицу — Python — Ответ 16109031
На строке 15 бесконечный цикл забирает себе «управление» и gui, по идее должен зависнуть. Вызывайте dblistener по таймеру и без бесконечных циклов.
Меню пользователя @ kapbepucm |
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Готовые ответы и решения:
Как обновить таблицу DataGridView при добавлении новых данных в БД SQL Server?
Создал проект в котором реализовал пока добавление новых записей в бд. Все добавляется, все хорошо.
Как обновить View Datagrid при добавлении данных из ViewModel MVVM
Вот код который берет данные из бд, через binding привязка к datagrid class AppViewModel .
Ошибка при добавлении данных в таблицу
Здравствуйте. Недавно начал изучать Entity Framework. Может кто поможет решить мою проблему. Есть.
Ошибка при добавлении данных в таблицу
Выбрасывает такую ошибку при записи в таблицу SQL.Add(‘insert into parent.
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Ошибка при добавлении данных в таблицу
При выполнении запроса на добавление в таблицу выходит такая ошибка. Не подскажите в чем дело? .
Ошибка при добавлении данных в таблицу
Появляется ошибка при добавлении данных в таблицу Оказание_услуги: SQL запрос: INSERT INTO.
Ошибка при добавлении данных в таблицу БД
Здравствуйте! У меня имеется страничка ASP, которая работает с БД через модель ADO.NET. На.
Создание триггера для добавления данных в одну таблицу при добавлении/изменении/удалении данных в другие
Есть таблица Changes_log(С полями idChanges_log, User_id(id пользователя,который внес изменения).
Ошибка при добавлении данных в таблицу FireBird
Здравствуйте. Подскажите пожалуйста в чем может быть проблема. Пытаюсь добавить запись в таблицу.
Динамическое обновление таблицы QtableWidget в PyQt5
В главном окне MainWindow создается таблица self.tableWidget , в которую поступают данные из класса DataParser (в данном примере этот класс явно не использован, примером данных, отправляемых этим классом является список list_to_add ). Данные вида list_to_add могут приходить в любое время.
При получении данных необходимо добавить новую запись в таблицу.
Для имеющихся записей нужно каждую секунду вычитать из текущей даты и времени, дату и время в list_to_add , соответствующих каждой записи и динамически обновлять значения в таблице в соотв. с результатом. Пример:
list_to_add = ['2021-02-02 09:00:00', 'PROGRAM', 'START'] #[operation date, operation name, status]
При получении такого списка, создаем новую строку, создаем ячейку, в которой храним разность текущей даты и времени и ‘2021-02-02 09:00:00’ , каждую секунду обновляем эту ячейку.
from PyQt5.QtWidgets import QApplication, QMainWindow, QGridLayout, QWidget, QTableWidget, QTableWidgetItem from PyQt5.QtCore import QSize, Qt from datetime import datetime from PyQt5.QtGui import * class MainWindow(QMainWindow): # Override class constructor def __init__(self): # You must call the super class method QMainWindow.__init__(self) self.setMinimumSize(QSize(480, 80)) # Set sizes self.setWindowTitle("Работа с QTableWidget") # Set the window title central_widget = QWidget(self) # Create a central widget self.setCentralWidget(central_widget) # Install the central widget grid_layout = QGridLayout(self) # Create QGridLayout central_widget.setLayout(grid_layout) # Set this layout in central widget self.tableWidget = QTableWidget(self) # Create a table header_font = QFont('Sergoe UI', 12) header_font.setWeight(QFont.Bold) self.tableWidget.setColumnCount(3) self.tableWidget.setHorizontalHeaderLabels([ "Относительное время","Абсолютное время", "Название операции"]) self.tableWidget.horizontalHeaderItem(0).setFont(header_font) self.tableWidget.horizontalHeaderItem(1).setFont(header_font) self.tableWidget.horizontalHeaderItem(2).setFont(header_font) self.tableWidget.setColumnWidth(0, 250) self.tableWidget.setColumnWidth(1, 250) self.tableWidget.setColumnWidth(2, 250) list_to_add = ['2021-02-02 09:00:00', 'PROGRAM', 'START'] #[operation date, operation name, status] rowPos = self.tableWidget.rowCount() date_now = datetime.now() datetime_event = datetime.strptime(list_to_add[0], '%Y-%m-%d %H:%M:%S') delta_sec = (datetime.now() - datetime_event).total_seconds() time_abs = self.convert_sec_to_time(delta_sec) self.tableWidget.insertRow(rowPos) self.tableWidget.setItem(rowPos, 2, QTableWidgetItem(list_to_add[1])) self.tableWidget.setItem(rowPos, 1, QTableWidgetItem(time_abs)) #grid_layout.addWidget(table, 0, 0) # Adding the table to the grid def convert_sec_to_time(self, seconds) -> str: hours, remainder = divmod(seconds, 3600) minutes, seconds = divmod(remainder, 60) return '::'.format(int(hours), int(minutes), int(seconds)) if __name__ == "__main__": import sys app = QApplication(sys.argv) mw = MainWindow() mw.show() sys.exit(app.exec())
Отслеживать
73.1k 107 107 золотых знаков 38 38 серебряных знаков 55 55 бронзовых знаков
задан 3 фев 2021 в 8:27
follow_the_sun follow_the_sun
87 6 6 бронзовых знаков
пожалуйста, предоставьте минимальный воспроизводимый пример и лучше расскажите, что вы хотите обновлять и какими данными вы хотите обновлять.
3 фев 2021 в 8:29
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Из того что я понял, для обнавления данных вам надо хранить ‘2021-02-02 09:00:00’ и я это сделал сохраняя эти данные в колонку с индексом 3.
Вы можете не показывать ее в таблице, применив строку:
self.tableWidget.setColumnHidden(3, True)
Я реализовал обновление данных после каждого добавления новой строки. Если вам все же надо обновляться каждую секунду (?), то необходимо реализовать повторяющиеся QTimer и каждую секунду выполнять:
# обновляем значения в таблице rows = self.tableWidget.rowCount() for row in range(rows): _data = self.tableWidget.item(row, 3).text() time_abs = self.time_abs_func([_data,]) # обратите внимание, что я вставляю обновленные данные . # в колонку с индексом 0 (ноль) - чтобы вы видели, что происходит . self.tableWidget.setItem(row, 0, QTableWidgetItem(time_abs)) # self.tableWidget.setItem(row, 1, QTableWidgetItem(time_abs))
Я прокомментировал для вас свой пример, попробуйте:
import sys import random # +++ from datetime import datetime from PyQt5.QtWidgets import QApplication, QMainWindow, QGridLayout, QWidget, \ QTableWidget, QTableWidgetItem from PyQt5.QtCore import QSize, Qt, QThread, pyqtSignal from PyQt5.QtGui import QFont class DataParser(QThread): data_signal = pyqtSignal(list) def __init__(self): super(DataParser, self).__init__() self._date = '' self._nameProg = '' self._start = '' self._flag = True def run(self): self.msleep(2000) # вставьте в этот цикл свою логику получения списка list_to_add # у меня это рандомный _list, который формируется каждые 10 секунд, # чтобы вы спокойно могли наблюдать что происходит while(self._flag): # '2021-02-02 09:00:00' обратите внимание я поменял дату self._date = f'2021-02-03 2>:'\ f'2>:'\ f'2>' self._nameProg = f'PROGRAM 2>' self._start = 'Что-то еще?' _list = [self._date, self._nameProg, self._start] self.data_signal.emit(_list) # отдаем список в основной поток self.msleep(10000) # спим 10 секунд class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setMinimumSize(QSize(480, 100)) self.setWindowTitle("Работа с QTableWidget") central_widget = QWidget(self) self.setCentralWidget(central_widget) grid_layout = QGridLayout(central_widget) # - self --> + central_widget . # central_widget.setLayout(grid_layout) # --- нет self.tableWidget = QTableWidget(self) header_font = QFont('Sergoe UI', 12) header_font.setWeight(QFont.Bold) self.tableWidget.setColumnCount(4) #(3) обратите внимание я добавил столбец self.tableWidget.setHorizontalHeaderLabels( [ "Относительное время","Абсолютное время", "Название операции"] ) self.tableWidget.horizontalHeaderItem(0).setFont(header_font) self.tableWidget.horizontalHeaderItem(1).setFont(header_font) self.tableWidget.horizontalHeaderItem(2).setFont(header_font) self.tableWidget.setColumnWidth(0, 190) # 250 self.tableWidget.setColumnWidth(1, 180) # 250 self.tableWidget.setColumnWidth(2, 180) # 250 self.tableWidget.setColumnWidth(3, 180) # обратите внимание я добавил столбец # ВНИМАНИЕ . раскомментируйте строку ниже, чтобы Скрыть столбец с индексом 3 . # self.tableWidget.setColumnHidden(3, True) # Скрыть столбец с индексом 3 . # list_to_add = ['2021-02-03 09:00:00', 'PROGRAM', 'START'] # обратите внимание я поменял дату list_to_add = ['2021-02-03 17:20:00', 'PROGRAM', 'START'] # . rowPos = self.tableWidget.rowCount() time_abs = self.time_abs_func(list_to_add) #- print(f'time_abs = ') self.tableWidget.insertRow(rowPos) self.tableWidget.setItem(rowPos, 1, QTableWidgetItem(time_abs)) self.tableWidget.setItem(rowPos, 2, QTableWidgetItem(list_to_add[1])) # обратите внимание я добавил столбец vvv . self.tableWidget.setItem(rowPos, 3, QTableWidgetItem(list_to_add[0])) #grid_layout.addWidget(table, 0, 0) # Adding the table to the grid grid_layout.addWidget(self.tableWidget, 0, 0) # +++ . # +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv self.thread = DataParser() self.thread.data_signal.connect(self.update_data) self.thread.start() def time_abs_func(self, list_to_add): date_now = datetime.now() datetime_event = datetime.strptime(list_to_add[0], '%Y-%m-%d %H:%M:%S') delta_sec = (datetime.now() - datetime_event).total_seconds() return self.convert_sec_to_time(delta_sec) def convert_sec_to_time(self, seconds) -> str: hours, remainder = divmod(seconds, 3600) minutes, seconds = divmod(remainder, 60) return '::'.format(int(hours), int(minutes), int(seconds)) def update_data(self, _data): """ Тут мы добавляем новую запись в таблицу и динамически обновляем значения в таблице. _data - это полученный из класса DataParser - list_to_add """ time_abs = self.time_abs_func(_data) # rowPos = self.tableWidget.rowCount() # добавить в конец rowPos = 0 # добавить в начало # добавляем новую запись self.tableWidget.insertRow(rowPos) self.tableWidget.setItem(rowPos, 1, QTableWidgetItem(time_abs)) self.tableWidget.setItem(rowPos, 2, QTableWidgetItem(_data[1])) self.tableWidget.setItem(rowPos, 3, QTableWidgetItem(_data[0])) # . # обновляем значения в таблице rows = self.tableWidget.rowCount() # for row in range(0, rows-1): # для rowPos = self.tableWidget.rowCount() for row in range(1, rows): # для rowPos = 0 _data = self.tableWidget.item(row, 3).text() time_abs = self.time_abs_func([_data,]) # обратите внимание, что я вставляю обновленные данные . # в колонку с индексом 0 (ноль) - чтобы вы видели, что происходит . self.tableWidget.setItem(row, 0, QTableWidgetItem(time_abs)) # self.tableWidget.setItem(row, 1, QTableWidgetItem(time_abs)) if __name__ == "__main__": app = QApplication(sys.argv) app.setFont(QFont("Times", 10, QFont.Bold)) mw = MainWindow() mw.resize(810, 500) mw.show() sys.exit(app.exec_())
Update
подскажите пожалуйста, как сделать, чтобы уже имеющиеся записи в разделе «абсолютное время» обновлялись каждую секунду? Для этого тоже надо создавать отдельный тред?
Обратите внимание на строки помеченные # *** QTimer
import sys import random # +++ from datetime import datetime from PyQt5.QtWidgets import QApplication, QMainWindow, QGridLayout, QWidget, \ QTableWidget, QTableWidgetItem from PyQt5.QtCore import QSize, Qt, QThread, pyqtSignal, QTimer # *** QTimer from PyQt5.QtGui import QFont class DataParser(QThread): data_signal = pyqtSignal(list) def __init__(self): super(DataParser, self).__init__() self._date = '' self._nameProg = '' self._start = '' self._flag = True def run(self): self.msleep(2000) # вставьте в этот цикл свою логику получения списка list_to_add # у меня это рандомный _list, который формируется каждые 5 секунд, # чтобы вы спокойно могли наблюдать что происходит while(self._flag): # '2021-02-02 09:00:00' обратите внимание я поменял дату self._date = f'2021-02-03 2>:'\ f'2>:'\ f'2>' self._nameProg = f'PROGRAM 2>' self._start = 'Что-то еще?' _list = [self._date, self._nameProg, self._start] self.data_signal.emit(_list) # отдаем список в основной поток self.msleep(5000) # спим 5 секунд . class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setMinimumSize(QSize(480, 100)) self.setWindowTitle("Работа с QTableWidget") central_widget = QWidget(self) self.setCentralWidget(central_widget) grid_layout = QGridLayout(central_widget) # - self --> + central_widget . # central_widget.setLayout(grid_layout) # --- нет self.tableWidget = QTableWidget(self) header_font = QFont('Sergoe UI', 12) header_font.setWeight(QFont.Bold) self.tableWidget.setColumnCount(4) #(3) обратите внимание я добавил столбец self.tableWidget.setHorizontalHeaderLabels( [ "Относительное время","Абсолютное время", "Название операции"] ) self.tableWidget.horizontalHeaderItem(0).setFont(header_font) self.tableWidget.horizontalHeaderItem(1).setFont(header_font) self.tableWidget.horizontalHeaderItem(2).setFont(header_font) self.tableWidget.setColumnWidth(0, 190) # 250 self.tableWidget.setColumnWidth(1, 180) # 250 self.tableWidget.setColumnWidth(2, 180) # 250 self.tableWidget.setColumnWidth(3, 180) # обратите внимание я добавил столбец # ВНИМАНИЕ . раскомментируйте строку ниже, чтобы Скрыть столбец с индексом 3 . self.tableWidget.setColumnHidden(3, True) # Скрыть столбец с индексом 3 . # list_to_add = ['2021-02-03 09:00:00', 'PROGRAM', 'START'] # обратите внимание я поменял дату list_to_add = ['2021-02-03 17:20:00', 'PROGRAM', 'START'] # . rowPos = self.tableWidget.rowCount() time_abs = self.time_abs_func(list_to_add) #- print(f'time_abs = ') self.tableWidget.insertRow(rowPos) self.tableWidget.setItem(rowPos, 1, QTableWidgetItem(time_abs)) self.tableWidget.setItem(rowPos, 2, QTableWidgetItem(list_to_add[1])) # обратите внимание я добавил столбец vvv . self.tableWidget.setItem(rowPos, 3, QTableWidgetItem(list_to_add[0])) #grid_layout.addWidget(table, 0, 0) # Adding the table to the grid grid_layout.addWidget(self.tableWidget, 0, 0) # +++ . self.thread = DataParser() self.thread.data_signal.connect(self.update_data) self.thread.start() self.timer = QTimer(self, interval=1000, timeout=self.updateTime) # *** QTimer self.timer.start() # *** QTimer def updateTime(self): # *** QTimer # обновляем значения в таблице rows = self.tableWidget.rowCount() for row in range(rows): _data = self.tableWidget.item(row, 3).text() time_abs = self.time_abs_func([_data,]) # обратите внимание, что я вставляю обновленные данные . # в колонку с индексом 0 (ноль) - чтобы вы видели, что происходит . # self.tableWidget.setItem(row, 0, QTableWidgetItem(time_abs)) self.tableWidget.setItem(row, 1, QTableWidgetItem(time_abs)) def time_abs_func(self, list_to_add): date_now = datetime.now() datetime_event = datetime.strptime(list_to_add[0], '%Y-%m-%d %H:%M:%S') delta_sec = (datetime.now() - datetime_event).total_seconds() return self.convert_sec_to_time(delta_sec) def convert_sec_to_time(self, seconds) -> str: hours, remainder = divmod(seconds, 3600) minutes, seconds = divmod(remainder, 60) return '::'.format(int(hours), int(minutes), int(seconds)) def update_data(self, _data): """ Тут мы добавляем новую запись в таблицу и динамически обновляем значения в таблице. _data - это полученный из класса DataParser - list_to_add """ time_abs = self.time_abs_func(_data) # rowPos = self.tableWidget.rowCount() # добавить в конец rowPos = 0 # добавить в начало # добавляем новую запись self.tableWidget.insertRow(rowPos) self.tableWidget.setItem(rowPos, 1, QTableWidgetItem(time_abs)) self.tableWidget.setItem(rowPos, 2, QTableWidgetItem(_data[1])) self.tableWidget.setItem(rowPos, 3, QTableWidgetItem(_data[0])) # . ''' # обновляем значения в таблице rows = self.tableWidget.rowCount() # for row in range(0, rows-1): # для rowPos = self.tableWidget.rowCount() for row in range(1, rows): # для rowPos = 0 _data = self.tableWidget.item(row, 3).text() time_abs = self.time_abs_func([_data,]) # обратите внимание, что я вставляю обновленные данные . # в колонку с индексом 0 (ноль) - чтобы вы видели, что происходит . # self.tableWidget.setItem(row, 0, QTableWidgetItem(time_abs)) self.tableWidget.setItem(row, 1, QTableWidgetItem(time_abs)) ''' if __name__ == "__main__": app = QApplication(sys.argv) app.setFont(QFont("Times", 10, QFont.Bold)) mw = MainWindow() mw.resize(810, 500) mw.show() sys.exit(app.exec_())