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

在Spyder中运行PyQt5应用程序时,它总是以-1退出

  •  2
  • Arnold  · 技术社区  · 6 年前

    我正在学习使用PyQt5编程。这没有什么问题,但有一个恼人的问题:当我启动应用程序时,我立即收到一条消息,表明发生了异常,并重新传输了SystemExit:-1(见下文)。

    An exception has occurred, use %tb to see the full traceback.
    
    SystemExit: -1
    
    /home/arnold/bin/anaconda3/envs/ml-gpu/lib/python3.5/site-packages/IPython/core/interactiveshell.py:2918: UserWarning: To exit: use 'exit', 'quit', or Ctrl-D.
      warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)
    
    
    In [2]: %tb
    Traceback (most recent call last):
    
      File "<ipython-input-1-f5ccc42a06e6>", line 1, in <module>
        runfile('/media/d/home/arnold/development/python/course_Qt/01-basic-window.py', wdir='/media/d/home/arnold/development/python/course_Qt')
    
      File "/home/arnold/bin/anaconda3/envs/ml-gpu/lib/python3.5/site-packages/spyder/utils/site/sitecustomize.py", line 692, in runfile
        execfile(filename, namespace)
    
      File "/home/arnold/bin/anaconda3/envs/ml-gpu/lib/python3.5/site-packages/spyder/utils/site/sitecustomize.py", line 101, in execfile
        exec(compile(f.read(), filename, 'exec'), namespace)
    
      File "/media/d/home/arnold/development/python/course_Qt/01-basic-window.py", line 19, in <module>
        sys.exit(app.exec_()) # mind the underscore, without is python function
    
    SystemExit: -1
    

    该程序非常简单:

    import sys
    from PyQt5.QtWidgets import QApplication, QWidget
    
    app = QApplication(sys.argv)
    win = QWidget() # No arguments = toplevel window
    win.setWindowTitle('Qt5 Window')
    win.resize(640, 480)
    win.show()
    
    # wrap Qt5 call in sys.exit in order to catch any unhandled exception
    # just good practice
    sys.exit(app.exec_()) # mind the underscore, without is python function
    

    程序运行正常之后,我可以做我想做的所有事情并正常退出。当我再次尝试运行该程序时,会收到以下消息:

    QCoreApplication::exec: The event loop is already running
    

    我强制终止程序,当我再次尝试运行它时,它会重新启动。是我的设置还是其他问题?在谷歌上搜索此错误时,我找不到任何提示。

    设置:linux min 18.3、Spyder 3.5、conda 4.4.11、PyQt 5.10.1

    使现代化

    下面卡洛斯的答案是正确的。我没有提到的是,我将QtDesigner与PyQt5一起使用,但找不到合适的示例。 This is the best I could find 我将其调整为Carlos下面提到的解决方案。拯救 pyqt_first.py tax_calc.ui pyuic5 -o tax_calc.py tax_calc.ui 一切都会好起来的。不要忘记将图形后端设置为 inline (工具>首选项>IPython控制台)。

    #--- pyqt_first.py ---
    import sys
    from PyQt5 import QtWidgets
    from PyQt5.QtWidgets import QMainWindow
    from tax_calc import Ui_MainWindow
    
    class HelloWindow(QMainWindow, Ui_MainWindow):
        def __init__(self):
            QMainWindow.__init__(self)
            Ui_MainWindow.__init__(self)
            self.setupUi(self)
            self.calc_tax_button.clicked.connect(self.CalculateTax)
    
        def CalculateTax(self):
            price = int(self.price_box.toPlainText())
            tax = (self.tax_rate.value())
            total_price = price  + ((tax / 100) * price)
            total_price_string = "The total price with tax is: " + str(total_price)
            self.results_window.setText(total_price_string)
    
    if __name__ == "__main__":
        def run_app():
            app = QtWidgets.QApplication(sys.argv)
            mainWin = HelloWindow()
            mainWin.show()
            app.exec_()
    
        run_app()
    
    #--- tax_calc.ui ---
    <?xml version="1.0" encoding="UTF-8"?>
    <ui version="4.0">
     <class>MainWindow</class>
     <widget class="QMainWindow" name="MainWindow">
      <property name="geometry">
       <rect>
        <x>0</x>
        <y>0</y>
        <width>800</width>
        <height>600</height>
       </rect>
      </property>
      <property name="windowTitle">
       <string>MainWindow</string>
      </property>
      <widget class="QWidget" name="centralwidget">
       <widget class="QTextEdit" name="price_box">
        <property name="geometry">
         <rect>
          <x>220</x>
          <y>100</y>
          <width>104</width>
          <height>71</height>
         </rect>
        </property>
       </widget>
       <widget class="QLabel" name="label">
        <property name="geometry">
         <rect>
          <x>50</x>
          <y>120</y>
          <width>91</width>
          <height>31</height>
         </rect>
        </property>
        <property name="font">
         <font>
          <pointsize>10</pointsize>
          <weight>75</weight>
          <bold>true</bold>
         </font>
        </property>
        <property name="text">
         <string>Price</string>
        </property>
       </widget>
       <widget class="QSpinBox" name="tax_rate">
        <property name="geometry">
         <rect>
          <x>230</x>
          <y>250</y>
          <width>42</width>
          <height>22</height>
         </rect>
        </property>
        <property name="value">
         <number>20</number>
        </property>
       </widget>
       <widget class="QLabel" name="label_2">
        <property name="geometry">
         <rect>
          <x>60</x>
          <y>250</y>
          <width>47</width>
          <height>13</height>
         </rect>
        </property>
        <property name="text">
         <string>Tax Rate</string>
        </property>
       </widget>
       <widget class="QPushButton" name="calc_tax_button">
        <property name="geometry">
         <rect>
          <x>230</x>
          <y>350</y>
          <width>111</width>
          <height>23</height>
         </rect>
        </property>
        <property name="text">
         <string>Calculate Tax</string>
        </property>
       </widget>
       <widget class="QTextEdit" name="results_window">
        <property name="geometry">
         <rect>
          <x>180</x>
          <y>410</y>
          <width>131</width>
          <height>71</height>
         </rect>
        </property>
       </widget>
       <widget class="QLabel" name="label_3">
        <property name="geometry">
         <rect>
          <x>170</x>
          <y>20</y>
          <width>441</width>
          <height>41</height>
         </rect>
        </property>
        <property name="font">
         <font>
          <pointsize>20</pointsize>
          <weight>75</weight>
          <bold>true</bold>
         </font>
        </property>
        <property name="text">
         <string>Sales Tax Calculator</string>
        </property>
       </widget>
      </widget>
      <widget class="QMenuBar" name="menubar">
       <property name="geometry">
        <rect>
         <x>0</x>
         <y>0</y>
         <width>800</width>
         <height>20</height>
        </rect>
       </property>
      </widget>
      <widget class="QStatusBar" name="statusbar"/>
     </widget>
     <resources/>
     <connections/>
    </ui>
    
    1 回复  |  直到 6 年前