2

I am learning to program with PyQt5. No troubles with that, but there is one annoying issue: when I start the app, I immediately get the message that an exception occurred and SystemExit: -1 is repported (see below).

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

The program is a very simple one:

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

The program runs fine after that, I can do all things what I want and normally exit. When I try to run the program again I get the message:

QCoreApplication::exec: The event loop is already running

I forcefully terminate the program and when I try to run it again it starts all over again. Is it my setup or is something else wrong? I could not find a hint when googling for this error.

Setup: linux min 18.3, Spyder 3.5, conda 4.4.11, PyQt 5.10.1

Update

The answer of Carlos below is the correct one. What I did not mention is that I used QtDesigner with PyQt5 and couldn't find a decent example for it. This is the best I could find and I adjusted it to the solution Carlos mentioned below. Save pyqt_first.py and tax_calc.ui, run pyuic5 -o tax_calc.py tax_calc.ui and everything should run fine. Do not forget to set the graphics backend to inline(Tools > Preferences > IPython console).

#--- 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>
Arnold
  • 4,578
  • 6
  • 52
  • 91
  • 1
    Possible duplicate of [What the error when I close the dialog](https://stackoverflow.com/questions/25007104/what-the-error-when-i-close-the-dialog). See also: [simple IPython example raises exception on sys.exit()](https://stackoverflow.com/q/10888045/984421). – ekhumoro Mar 04 '18 at 17:50
  • PS: you are completely wrong to assume that `sys.exit()` catches unhandled exceptions. In fact, it actually *raises* an exception (`SystemExit`) and simply returns an exit code. – ekhumoro Mar 04 '18 at 17:51
  • @Ekhumoro, thanks for your explanations. I do not think this is a full duplicate of the quetion you mentioned. It mentions a SystemExit of 0 while in my situation it exits with -1. – Arnold Mar 06 '18 at 18:36
  • The exit code is totally irrelevant. The point is that you cannot use `sys.exit` at all. The answer below from one of the Spyder maintainers confirms that your question is a duplicate. – ekhumoro Mar 06 '18 at 18:46
  • I know and I am working on it. I know Carlos's work and resp[ect it very much. – Arnold Mar 06 '18 at 19:20

1 Answers1

3

(Spyder maintainer here) When you run programs in Spyder you're doing it in interactive mode, meaning that you don't need to add a sys.exit call at the end of them, because that simply tries to kill the process responsible for running your code.

That's precisely what this warning is telling you:

warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)

It means that to exit an IPython session you need to follow one of the above methods, instead of using sys.exit.

The solution to this problem (which has been asked a lot of times already) is in our wiki.

Rodrigo
  • 5,938
  • 6
  • 31
  • 39
Carlos Cordoba
  • 33,273
  • 10
  • 95
  • 124
  • Thanks a lot for your suggestion. I copy and pasted the wiki example with no changes whatsoever. When run, it returns immediately without showing any window or any message. When I run it a second time the kernel hangs and I have to restart it. I tried another example based on QtDesigner but it has the same issue. When I run sys.exit(app.exec_)) I get a window with of course the message I reported above. – Arnold Mar 06 '18 at 19:54
  • 1
    Did you change your Graphics backend to Automatic? – Carlos Cordoba Mar 06 '18 at 22:31
  • Ah, that did it! I changed it to inline and got it all running, including the QtDesigner examples with UiWindow. No more crashing kernels. I'll update my question because I couldn't find a PyQt5 example with QtDesigner. Thanks Carlos! – Arnold Mar 07 '18 at 15:10
  • 1
    Glad you can use Spyder now to develop your Qt5 apps! – Carlos Cordoba Mar 07 '18 at 15:48