Эти вычисления включали не только методы, которые напрямую изменяют элементы графического интерфейса, такие как setText, setEnabled и textBrowser.append, а также методы, которые извлекают состояние элементов графического интерфейса, например isChecked() и text().
Хотя программа работал без ошибок, ChatGPT сообщил мне, что прямое управление элементами графического интерфейса из потоков, отличных от основного потока, может вызвать проблемы. В результате я начал конвертировать все эти методы для использования механизмов сигнала/слота. Следовательно, в класс MyWindow был добавлен следующий дополнительный код, из-за которого его довольно неудобно обрабатывать:
Код: Выделить всё
to_textBrowser = pyqtSignal(str)
to_textBrowser_2 = pyqtSignal(str)
to_textBrowser_3 = pyqtSignal(str)
to_statusBar = pyqtSignal(str)
clear_textBrowser = pyqtSignal()
clear_textBrowser_2 = pyqtSignal()
to_lineEdit_10 = pyqtSignal(str)
to_lineEdit_12 = pyqtSignal(str)
to_lineEdit_14 = pyqtSignal(str)
to_lineEdit_16 = pyqtSignal(str)
to_lineEdit_18 = pyqtSignal(str)
to_lineEdit_20 = pyqtSignal(str)
to_label_text = pyqtSignal(QObject, str)
guest_backup_dialog_signal = pyqtSignal()
accountbook_dialog_signal = pyqtSignal()
show_popup_signal = pyqtSignal()
set_enable = pyqtSignal(QObject, bool)
set_check = pyqtSignal(QObject, bool)
set_exclusive = pyqtSignal(QObject, bool)
get_check = pyqtSignal(QObject)
get_text = pyqtSignal(QObject)
def __init__(self):
self.to_label_text.connect(lambda label, text: label.setText(text))
self.set_enable.connect(lambda obj, bool: obj.setEnabled(bool))
self.set_check.connect(lambda obj, bool: obj.setChecked(bool))
self.set_exclusive.connect(lambda obj, bool: obj.setExclusive(bool))
self.to_textBrowser.connect(lambda text : (self.textBrowser.append(text), trading_history_q.put(text)))
self.to_textBrowser_2.connect(lambda text : (self.textBrowser_2.append(text), trading_history_q.put(text)))
self.to_textBrowser_3.connect(lambda text : (self.textBrowser_3.append(text), trading_history_q.put(text)))
self.to_statusBar.connect(lambda text : self.statusBar().showMessage(text))
self.clear_textBrowser.connect(lambda : self.textBrowser.clear())
self.clear_textBrowser_2.connect(lambda : self.textBrowser_2.clear())
self.to_lineEdit_10.connect(lambda text : self.lineEdit_10.setText(text))
self.to_lineEdit_12.connect(lambda text : self.lineEdit_12.setText(text))
self.to_lineEdit_14.connect(lambda text : self.lineEdit_14.setText(text))
self.to_lineEdit_16.connect(lambda text : self.lineEdit_16.setText(text))
self.to_lineEdit_18.connect(lambda text : self.lineEdit_18.setText(text))
self.to_lineEdit_20.connect(lambda text : self.lineEdit_20.setText(text))
self.get_check_value = None
def get_check_(object_):
self.get_check_value = object_.isChecked()
self.get_check.connect(get_check_)
self.get_text_value = None
def get_text_(object_):
self.get_check_value = object_.text()
self.get_text.connect(get_text_)
Несмотря на принятие этих мер предосторожности, я никогда не сталкивался с какими-либо конкретными проблемами или ошибками, связанными с прямым доступом к элементам графического интерфейса из потоков, отличных от основного потока. Это заставляет меня задуматься, а не были ли мои усилия излишними.
Подробнее здесь: https://stackoverflow.com/questions/787 ... signal-slo