Почему QLabel перестает обновляться по прошествии времени?

Здравствуйте. Я не программист. Пытаюсь сделать оболочку над базой данных СКД. Возможностей стандартного софта не хватает.

Каждые 500 миллисекунд (точность не важна) происходит запрос к базе данных. Если данные обновились, то они выводятся на экран.

Проблема в том что GUI иногда зависает. Пробовал проверять с помощью вывода времени в консоль приложения и вывода этих же значений в combobox, печать и добавление значений для проверки (выбрал его по тому что он был добавлен на экран). В определенный момент времени GUI перестает обновляться, хотя время продолжает обновляться и добавляться внутрь combobox.

Проблема скорее всего где то в коде, но из-за того что знаний не много сам разобраться не могу.

UPD: Не знаю в чем причина, но уже 25 минут работает без зависаний. Возможно совпадение, но перед этим добавил вывод и добавление элементов в combobox для теста.

from string import punctuation
import datetime
import numpy
import pyodbc
from PyQt5 import QtWidgets
import sys
from PyQt5.QtGui import QPixmap
import sqltestui
import threading


m = 0
newImage = 0

class ExampleApp(QtWidgets.QMainWindow, sqltestui.Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.pushButton.clicked.connect(self.sqltest1)

        self.foo()

    def foo(self):
        global m
        global newImage
        testarray = []
        cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=DESKTOP-8EKCG28\RUSGUARD;DATABASE=RUSGUARDDB')
        cursor = cnxn.cursor()
        idNumber = cursor.execute('SELECT TOP(1) _id FROM RusGuardDB.dbo.Log where logmessagetype = 1 and logmessagesubtype = 66 ORDER BY _id DESC').fetchone()
        row_to_int = [int(x) for x in idNumber]
        if row_to_int[0] != m:
            m = row_to_int[0]
            newImage = newImage + 1
        empid = cursor.execute ('SELECT TOP(3) EmployeeID FROM RusGuardDB.dbo.Log where logmessagetype = 1 and logmessagesubtype = 66 ORDER BY _id DESC').fetchall()
        empfullid = numpy.array(empid)
        for i in range(len(empfullid)):
            g = str(empfullid[i])
            v = g.translate(str.maketrans('', '', punctuation))
            teste = cursor.execute(F"select [Фото 1] from RusGuardDB.dbo.EmployeesView where _id = '{v}'").fetchone()
            testarray.append(teste)
        cursor.close()
        name_array = numpy.array(testarray)
        #вывод в label1 последнее изображение
        for row in teste:
            row_to_list = [elem for elem in row]
        pixmap = QPixmap()
        pixmap1 = QPixmap()
        pixmap2 = QPixmap()
        pixmap.loadFromData(bytearray(name_array[0]))
        pixmap1.loadFromData(bytearray(name_array[1]))
        pixmap2.loadFromData(bytearray(name_array[2]))
        if newImage == 1:
            self.label1.setPixmap(pixmap.scaled(self.label1.size(), aspectRatioMode = 1))
            self.label1_2.setPixmap(pixmap1.scaled(self.label1_2.size(), aspectRatioMode = 1))
            self.label1_3.setPixmap(pixmap2.scaled(self.label1_3.size(), aspectRatioMode = 1))
        if newImage == 2:
            self.label1.setPixmap(pixmap.scaled(self.label1.size(), aspectRatioMode = 1))
            self.label1_2.setPixmap(pixmap1.scaled(self.label1_2.size(), aspectRatioMode = 1))
            self.label1_3.setPixmap(pixmap2.scaled(self.label1_3.size(), aspectRatioMode = 1))
        if newImage == 3:
            self.label1.setPixmap(pixmap.scaled(self.label1.size(), aspectRatioMode = 1))
            self.label1_2.setPixmap(pixmap1.scaled(self.label1_2.size(), aspectRatioMode = 1))
            self.label1_3.setPixmap(pixmap2.scaled(self.label1_3.size(), aspectRatioMode = 1))
            newImage = 0

        self.comboBox.addItem(str(datetime.datetime.now()))
        self.comboBox.setEditText(str(datetime.datetime.now()))
        print (str(datetime.datetime.now()))

        threading.Timer(0.5, self.foo).start()

def main():

    app = QtWidgets.QApplication(sys.argv)
    window = ExampleApp()
    window.show()
    app.exec_()


if __name__ == '__main__':
    main()
  • Вопрос задан
  • 53 просмотра
Решения вопроса 1
@KPeoJI Автор вопроса
Проблему зависания решил. Перевел обновление GUI в основной поток с помощью pyqtSignal
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы