【问题标题】:PyQt window closes immediately after openingPyQt 窗口在打开后立即关闭
【发布时间】:2013-04-17 20:31:45
【问题描述】:

我在尝试打开 PyQt 窗口时遇到问题。

下面的代码是我原始代码的示例。当我在import Test 中导入模块并运行test.Start() 时,出现以下错误:

QCoreApplication::exec: 事件循环已经在运行

经过一番研究,我发现是因为我已经做了一个QApplication

test.py....
import sys

def Start():
    app = QApplication(sys.argv)
    m = myWindow()
    m.show()
    app.exec_()

class myWindow():....

if __name__ == "__main__":
    Start()

然后我读到我可以像这样重写我的代码,它会修复错误:

test.py....

def Start():
    m = myWindow()
    m.show()


class myWindow():....

if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    Start()
    app.exec_()

现在我不再收到 QCoreApplication::exec: The event loop is already running 错误,但我的窗口在打开后几乎立即关闭。

【问题讨论】:

    标签: python pyqt4


    【解决方案1】:

    您需要保留对打开的窗口的引用,否则它会超出范围并被垃圾收集,这也会破坏底层 C++ 对象。试试:

    def Start():
        m = myWindow()
        m.show()
        return m
    
    
    class myWindow():....
    
    if __name__ == "__main__":
        import sys
        app = QApplication(sys.argv)
        window = Start()
        app.exec_()
    

    【讨论】:

      【解决方案2】:

      你也可以这样做:

      def Start():
          global m
          m = myWindow()
          m.show()
      
      class myWindow():....
      
      if __name__ == "__main__":
          import sys
          app = QApplication(sys.argv)
          window = Start()
          app.exec_()
      

      【讨论】:

        【解决方案3】:

        使用以下代码。据我所知,您的问题在于您的导入并使用“show”作为函数的名称。你没有提供你在课堂上写的东西,所以很难猜到。但是下面的代码就像一个魅力。 ;-)

        祝你好运!

        import sys
        from PyQt5 import *
        from PyQt5.QtGui import *
        from PyQt5.QtWidgets import *
        
        app = QApplication(sys.argv)
        def Start():
            m = myWindow()
            m.showWid()
            sys.exit(app.exec())
        
        class myWindow:
          def __init__(self):
            self.window = QWidget()
            self.window.setWindowTitle("Program Title")
            self.window.setFixedWidth(600)
            self.window.setStyleSheet("background: #18BEBE;")
        
          def showWid(self):
            self.window.show()
        
        if __name__ == "__main__":
            Start()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多