代码之家  ›  专栏  ›  技术社区  ›  Guimoute

如何在接口加载完成后立即调用PyQt5中的方法?

  •  2
  • Guimoute  · 技术社区  · 7 年前

    我正在Qt5中制作一个仪器接口,它工作正常。唯一的问题是它启动缓慢,因为接口 __init__ 包含用于连接仪器的耗时方法(5-10秒)。目前,几秒钟内没有显示任何内容,然后整个界面显示“成功连接到仪器”消息,该消息已写入其控制台(文本编辑小部件)。

    我想要的是 我确信这只是一个移动一条线的问题,但我无法理解。感谢您的帮助。

    # ================================================
    #      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 回复  |  直到 7 年前
        1
  •  2
  •   eyllanesc    7 年前

    需要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