Я создал скрипт pyqt5, который использует python3.6. Мои скрипты получают ввод с последовательного устройства и обновляют графический интерфейс и удаленную базу данных, а также принимают удаленный ввод из веб-браузера и вносят необходимые изменения в последовательное устройство и соответственно обновляют графический интерфейс. Я использую QTimer для запуска 4 функций / методов в фоновом режиме, чтобы добиться этого, и это работает. Но проблема в том, что после получения ручного ввода или удаленного ввода (из веб-браузера) для внесения необходимых изменений в последовательном устройстве и графическом интерфейсе требуется почти 15-20 секунд, и это делает графический интерфейс практически не отвечающим (он реагирует после почти 15-20 секунд). Я пробовал QThread, но он всегда приводит к множественному доступу к последовательному порту одновременно, что приводит к сбою сценария. Пожалуйста, помогите мне в этом.
from PyQt5.QtCore import QTimer, QThread
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.uic import loadUiType
import os
import sys
import time
import serial
import MySQLdb
from pathlib import Path
import json
ui, _ = loadUiType('myapplication.ui')
class MainApp(QMainWindow, ui):
def __init__(self):
QMainWindow.__init__(self)
self.setupUi(self)
def new_method1(self):
print("This is new_method1")
def new_method2(self):
print("This is new_method2")
def new_method3(self):
print("This is new_method3")
def new_method4(self):
print("This is new_method4")
def continuous_calling(self):
self.timer = QTimer()
self.timer.timeout.connect(self.new_method1)
self.timer.start(1000)
self.timer.timeout.connect(self.new_method2)
self.timer.start(1000)
self.timer.timeout.connect(self.new_method3)
self.timer.start(1000)
self.timer.timeout.connect(self.new_method4)
self.timer.start(1000)
def main():
app = QApplication(sys.argv)
window = MainApp()
window.move(0, -30)
window.show()
window.continuous_calling()
app.exec_()
if __name__ == '__main__':
main()
Здесь я хочу непрерывно запускать методы new_method1, new_method2, new_method3 & new_method4 в фоновом режиме до тех пор, пока графический интерфейс не завершится, не заморозив графический интерфейс. Спасибо.
дополнительная информация :: Это пример других функций, которые управляют прямым пользовательским вводом из GUI (нажатие кнопок из GUI). И эти функции не работают в фоновом режиме неоднократно. Эти функции запускаются только при нажатии кнопок (в графическом интерфейсе).
def ser_conn_on_zero(self):
self.ser = serial.Serial(
port=self.comm_port,
baudrate=9600,
bytesize=serial.EIGHTBITS,
parity=serial.PARITY_EVEN,
stopbits=serial.STOPBITS_ONE,
timeout=1)
if self.ser.isOpen():
print("Open: " + self.ser.name)
self.ser.flushInput()
self.ser.flushOutput()
self.ser.close()
self.ser.open()
print('Connected to :' + self.comm_port)
print("Turning ON Relay Zero")
self.ser.write(b'\x46\x6D\x45\x63\x73\x4B\x6F\x6C\x00\x05\x00\x01\x00\x01\x00\r\n')
output = self.ser.readline().decode('iso-8859-1')
print("Serial Response: " + output)
self.ser.close()
print("Serial connection Closed for Relay Zero")
conn = MySQLdb.connect("XX.XX.XX.XX", "User2", "PASSWORD", "TestSite_001", use_unicode=True, charset="utf8")
cursor = conn.cursor()
try:
cursor.execute("update some_table set chn = %s where id = %s", (1, 1))
conn.commit()
except MySQLdb.Error as e:
print("ser_conn_on_zero: couldn't update the remote database : ", str(e))
cursor.close()
conn.close()