Не могу правильно настроить закрытие приложения
Кое-как, просмотрев массу инфы и документации вроде как реализовал закрытие приложения через виджет 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 "MS Shell Dlg 2";</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 "MS Shell Dlg 2";</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 "MS Shell Dlg 2";</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 "MS Shell Dlg 2";</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 шт):
Виджеты закрывать нужно через 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_())
