PyQt5 испускать сигнал от другого модуля - PullRequest
1 голос
/ 10 марта 2019

Уже неделю ищем решение и до сих пор не получили его. Я просмотрел учебники YouTube, документацию по PyQt5 и случаи использования stackoverflow, но там описано, как использовать сигналы и слоты другим способом, которого я хочу достичь. Даже после следования рекомендациям более опытных программистов я не могу вызвать сигнал испускания из другого модуля, но я могу излучать из того же модуля.

Функция Convert_main на основе заданного ввода (список из 10-20 чисел - self.window.input_line.text ()) выполняет цикл для каждого числа из списка. В конце каждого цикла я хочу обновить индикатор выполнения, чтобы пользователь знал ход выполнения основного кода. Я могу излучать сигнал только внутри класса ThreadClass и не могу излучать из функции convert_main (комментарии в коде для справки). Что я делаю не так :( Как мне переставить код, чтобы он соответствовал моим потребностям?

В состоянии отладчика я не получаю никакой ошибки, и код завершен, но прогресс_бара все еще не обновляется.

#*****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 голосов
/ 10 марта 2019

Сигнал испускается, но значение, которое излучается, равно нулю, поскольку:

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))
...