Не могу правильно настроить закрытие приложения

Кое-как, просмотрев массу инфы и документации вроде как реализовал закрытие приложения через виджет QT Designer Menubar action c с помощью функции quit() в Pycharm и он заработал(возможно я на автомате подключил в пайчарме какой-то модуль, чтобы оно заработало(выходило из приложения)), однако скопировав код из PyCharm на другой компьютер в другую IDE код вызвал исключение. Кто знает, что не так и как исправить или расскажет о другом способе через подключение файла .ui из Qt designer запрограммировать закрытие приложения через Menubar action? Код в PyCharm(вроде как работающий, но это не точно, потому что не уверен в правильности реализации))

from PyQt5 import uic
from PyQt5.QtWidgets import QApplication, QAction

Form, Window = uic.loadUiType("template1.ui")

app = QApplication([])
window = Window()
form = Form()
form.setupUi(window)
window.show()


def was_clicked():
    print("Clicked!")


def exit_action():
    form.quit()



form.pushButton.clicked.connect(was_clicked)
form.action.triggered.connect(exit_action)

app.exec()

Файл template1.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>969</width>
    <height>734</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Deqart</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QPushButton" name="pushButton">
    <property name="geometry">
     <rect>
      <x>420</x>
      <y>100</y>
      <width>125</width>
      <height>160</height>
     </rect>
    </property>
    <property name="styleSheet">
     <string notr="true">font: 75 72pt &quot;MS Shell Dlg 2&quot;;</string>
    </property>
    <property name="text">
     <string>▲</string>
    </property>
   </widget>
   <widget class="QPushButton" name="pushButton_2">
    <property name="geometry">
     <rect>
      <x>420</x>
      <y>400</y>
      <width>125</width>
      <height>160</height>
     </rect>
    </property>
    <property name="styleSheet">
     <string notr="true">font: 75 72pt &quot;MS Shell Dlg 2&quot;;</string>
    </property>
    <property name="text">
     <string>▼</string>
    </property>
   </widget>
   <widget class="QPushButton" name="pushButton_3">
    <property name="geometry">
     <rect>
      <x>200</x>
      <y>270</y>
      <width>160</width>
      <height>125</height>
     </rect>
    </property>
    <property name="styleSheet">
     <string notr="true">font: 75 72pt &quot;MS Shell Dlg 2&quot;;</string>
    </property>
    <property name="text">
     <string>◀</string>
    </property>
   </widget>
   <widget class="QPushButton" name="pushButton_4">
    <property name="geometry">
     <rect>
      <x>600</x>
      <y>270</y>
      <width>160</width>
      <height>125</height>
     </rect>
    </property>
    <property name="styleSheet">
     <string notr="true">font: 75 72pt &quot;MS Shell Dlg 2&quot;;</string>
    </property>
    <property name="text">
     <string>▶</string>
    </property>
   </widget>
   <widget class="QLabel" name="label">
    <property name="geometry">
     <rect>
      <x>360</x>
      <y>310</y>
      <width>50</width>
      <height>50</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <pointsize>25</pointsize>
     </font>
    </property>
    <property name="text">
     <string>OX</string>
    </property>
   </widget>
   <widget class="QLabel" name="label_2">
    <property name="geometry">
     <rect>
      <x>550</x>
      <y>310</y>
      <width>50</width>
      <height>50</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <pointsize>25</pointsize>
     </font>
    </property>
    <property name="text">
     <string>OX</string>
    </property>
   </widget>
   <widget class="QLabel" name="label_3">
    <property name="geometry">
     <rect>
      <x>460</x>
      <y>350</y>
      <width>50</width>
      <height>50</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <pointsize>25</pointsize>
     </font>
    </property>
    <property name="text">
     <string>OY</string>
    </property>
   </widget>
   <widget class="QLabel" name="label_4">
    <property name="geometry">
     <rect>
      <x>460</x>
      <y>260</y>
      <width>50</width>
      <height>50</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <pointsize>25</pointsize>
     </font>
    </property>
    <property name="text">
     <string>OY</string>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>969</width>
     <height>21</height>
    </rect>
   </property>
   <widget class="QMenu" name="menuFile">
    <property name="title">
     <string>Файл</string>
    </property>
    <addaction name="action"/>
   </widget>
   <widget class="QMenu" name="menu">
    <property name="title">
     <string>Настройки</string>
    </property>
    <addaction name="action_2"/>
   </widget>
   <widget class="QMenu" name="menu_2">
    <property name="title">
     <string>Программирование</string>
    </property>
   </widget>
   <widget class="QMenu" name="menu_3">
    <property name="title">
     <string>Помощь</string>
    </property>
   </widget>
   <addaction name="menuFile"/>
   <addaction name="menu"/>
   <addaction name="menu_2"/>
   <addaction name="menu_3"/>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
  <action name="action">
   <property name="text">
    <string>Выход</string>
   </property>
  </action>
  <action name="action_2">
   <property name="text">
    <string>Настройки</string>
   </property>
  </action>
 </widget>
 <resources/>
 <connections/>
</ui>

Этот же код в Tonny Python IDE

from PyQt5 import uic
from PyQt5.QtWidgets import QApplication, QAction

Form, Window = uic.loadUiType("template1.ui")

app = QApplication([])
window = Window()
form = Form()
form.setupUi(window)
window.show()

def exit_action():
    form.quit()
form.action.triggered.connect(exit_action)
app.exec()

Тут скриншот описания исключения

Скриншот описания исключения


Ответы (2 шт):

Автор решения: gil9red

Виджеты закрывать нужно через close, а у вас виджетом не является Form, это просто класс с виджетами, которые помещаются на конкретный виджет, коим будет тот, что в setupUi передается, т.е. widget

Нужно form.quit() заменить на window.close()

Пример:

from PyQt5 import uic
from PyQt5.QtWidgets import QApplication, QAction

Form, Window = uic.loadUiType("template1.ui")


app = QApplication([])
window = Window()
form = Form()
form.setupUi(window)
window.show()


def was_clicked():
    print("Clicked!")


def exit_action():
    window.close()


form.pushButton.clicked.connect(was_clicked)
form.action.triggered.connect(exit_action)

app.exec()
→ Ссылка
Автор решения: Владимир

Этот код проверен в Thonny

main.py

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.uic import loadUi


class New(QMainWindow):
    def __init__(self):
        super(New, self).__init__()

        loadUi("template1.ui", self)
        self.setWindowTitle('New')

        self.pushButton.clicked.connect(self.was_clicked)
        self.action.triggered.connect(self.exit_action)


    def was_clicked(self):
        print("Clicked!")

    def exit_action(self):
        #sys.exit()     # Так
        self.close()    # или так


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = New()
    window.show()
    sys.exit(app.exec_())
→ Ссылка