#python #pyqt5 #qthread
#python #pyqt5 #qthread
Вопрос:
Уже более недели ищу решение и до сих пор его не получаю. Я просмотрел учебные пособия YouTube, документацию PyQt5 и примеры stackoverflow, но там описано, как использовать сигналы и слот другим способом, которого я хочу достичь. Даже после выполнения рекомендаций более опытных программистов я не могу вызвать emit signal из другого модуля, но я могу emit из того же модуля.
Функция Convert_main на основе заданных входных данных (список из 10-20 чисел — self.window.input_line.text()) выполняет цикл для каждого числа из списка. В конце каждого цикла я хочу обновлять индикатор выполнения, чтобы пользователь знал о ходе выполнения основного кода. Я могу выдавать сигнал только внутри класса ThreadClass и не могу выдавать из функции convert_main (комментарии в коде для справки). Что я делаю неправильно: (Как я должен изменить свой код, чтобы он соответствовал моим потребностям?
В состоянии отладчика я не получаю никаких ошибок, и результат кода выполнен, но progress_bar все еще не обновляется.
#*****ui_main.py module****
import sys
import convert
import db_analysis
import qdarkstyle
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import QThread
from PyQt5 import QtCore, uic
Ui_MainWindow, QtBaseClass = uic.loadUiType('interface.ui')
class Window(QtBaseClass, Ui_MainWindow):
def __init__(self, parent=None):
super(QtBaseClass, self).__init__(parent)
self.setupUi(self)
self.worker = ThreadClass(self)
self.worker.signal.connect(self.update_progress_bar) # connecting signal to slot
self.push_import.clicked.connect(self.import_data)
self.push_cancel.clicked.connect(self.close_app)
self.push_ok.clicked.connect(self.process_input)
def update_progress_bar(self, progress_val):
self.input_progress_bar.setValue(progress_val)
def import_data(self):
db_analysis.insert_data()
def process_input(self):
self.worker.start()
class ThreadClass(QThread):
signal = QtCore.pyqtSignal(int)
def __init__(self, window, parent=None):
super(ThreadClass, self).__init__(parent)
self.window = window
def run(self):
self.signal.emit(20) #<-- that's working
convert.convert_main(self, self.window.input_line.text()) #<--passing ThreadClass self to convert.py so I can emit signal from convert_main
def main():
app = QApplication(sys.argv)
app.setQuitOnLastWindowClosed(False)
app.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())
window = Window()
window.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
#*****convert.py module********
def convert_main(worker, input_array):
worker = worker.signal
my_list = list(map(int, input_array.split(" ")))
for a in my_list:
#some loop code
worker.emit(my_list.index(a)/len(my_list)) #<-- that's not working
Ответ №1:
Сигнал передается, но значение, которое передается, равно нулю, поскольку:
0 <= my_list.index(element) < len(my_list)
Итак
0 <= my_list.index(element)/len(my_list) < 1.0
И как вы сигнализируете о том, что сигнал выдает целые числа, это приблизится к значению 0. Итак, решение состоит в том, чтобы масштабировать его до значения от 0 до 100:
def convert_main(worker, input_array):
worker = worker.signal
my_list = list(map(int, input_array.split(" ")))
for i, a in enumerate(my_list):
#some loop code
worker.emit(100*(i 1)/len(my_list))