Здравствуйте. Я не программист. Пытаюсь сделать оболочку над базой данных СКД. Возможностей стандартного софта не хватает.
Каждые 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()