Как вызвать метод в PyQt5 сразу после загрузки интерфейса? - PullRequest
0 голосов
/ 10 января 2019

Я делаю интерфейс инструмента в Qt5, и он работает нормально. Единственная проблема заключается в том, что он медленно запускается, потому что интерфейс __init__ содержит трудоемкий метод (5-10 секунд), используемый для подключения к инструменту. В настоящее время ничего не отображается в течение нескольких секунд, после чего весь интерфейс отображается с сообщением «успешно подключено к инструменту», уже записанным в его консоли (виджет textEdit).

Мне бы хотелось, чтобы мгновенно отобразил интерфейс, и только после его показа должен запуститься протокол связи. Я уверен, что это всего лишь вопрос перемещения одной строки, но я не могу понять это. Любая помощь приветствуется.

Вот минимальный пример структуры программы:

# ================================================
#      Interface management.
# ================================================

class RENAMEMELATER(Ui_renamemetoo, QObject):

     def __init__(self, parent):
        super(Ui_renamemetoo, self).__init__()
        self.ui = Ui_renamemetoo()
        self.ui.setupUi(parent)

        # Redirect IDE console towards GUI console.
        sys.stdout = EmittingStream()
        sys.stdout.textWritten.connect(self.redirect_console_messages)
        sys.stderr = EmittingStream()
        sys.stderr.textWritten.connect(self.redirect_console_messages)

        # Initialize PC/instrument communication (MOVE SOMEWHERE ELSE?)
        self.T = TaborSE5082("USB0::0x168C::0x5082::0000218391::INSTR") # TIME CONSUMING.



   def redirect_console_messages(self, text):
       """All print() from the program are appended on a textEdit
          instead of the IDE console."""

        self.ui.Console_textEdit.append(text.rstrip("\n"))



    def close_program(self):
        """Call those functions after the user clicked on exit."""

        self.T.CLOSE()
        sys.stdout = sys.__stdout__
        sys.stderr = sys.__stderr__
        print("Program terminated.")

# ================================================
#      Program execution.
# ================================================

if __name__ == "__main__":

    # Define the app.
    if not QtWidgets.QApplication.instance():
        app = QtWidgets.QApplication(sys.argv)
    else:
        app = QtWidgets.QApplication.instance()

    # Start the interface.
    Form = QtWidgets.QWidget()
    prog = RENAMEMELATER(Form)
    Form.show()

    # Handle what happens at program exit.
    app.setQuitOnLastWindowClosed(True)
    app.aboutToQuit.connect(prog.close_program)

    # Launch.
    app.exec()

В основном я могу использовать app.aboutToQuit, чтобы закрыть инструмент. Может быть, есть какой-то app.isDoneLoading, который я мог бы .connect для инициализации моего инструмента таким же образом?

Спасибо.

1 Ответ

0 голосов
/ 10 января 2019

Задача, которая занимает от 5 до 10 секунд, тяжелая, поэтому, не показывая GUI, вы можете заморозить ее, поэтому решение состоит в том, чтобы запустить ее в другом потоке:

def __init__(self, parent):

    # ...
    threading.Thread(target=self.callback, daemon=True).start()

def callback(self):
    self.T = TaborSE5082("USB0::0x168C::0x5082::0000218391::INSTR")
    # another code
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...