Python pyq4 виджет выход после выполнения файла

у меня есть проект python.и я новичок в pyqt4, но я столкнулся с проблемой и не могу найти решение. Мой проект имеет основной файл под названием main.py а содержание его таково:

import os
import sys

from PyQt4 import QtGui, uic
import setup, modules


class MyWindow(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        super(MyWindow, self).__init__()
        file_path = os.path.abspath("form_ui/main_window.ui")
        uic.loadUi(file_path, self)
        self.show()
        self.statusBar().showMessage('Developer contact: admin.unu@protonmail.com')                #message on status bar of main window
        self.actionExit.triggered.connect(self.close)                                              #action to close main windows
        self.actionSetup.triggered.connect(setup.setup_gui.setupgui)                               #action to run setup_guy.py
        self.actionUser.triggered.connect(modules.user_form.user_set)                              #action to run user_form.py
        self.actionClient_check.triggered.connect(modules.client_read.client_read_op)              #action to rin client_read.py
        self.actionClient_add.triggered.connect(modules.client_make.client_make_op)                #action to run client_make.py
        self.actionEquipment_add.triggered.connect(modules.add_equipment.add_equipment_op)         #action to run add_equipment.py
        self.actionOrders.triggered.connect(modules.comanda.comanda_def)                           #action to run comanda.py
        self.actionServices.triggered.connect(modules.services.add_services_op)                    #action to run services.py
        self.actionList_data.triggered.connect(modules.list_data.list_data_op)                     #action to run list_data.py
        self.move(QtGui.QApplication.desktop().screen().rect().center()- self.rect().center())     #center main windows

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec_())

Приложение запускается и запускается графический интерфейс. Каждое действие запускает qwidget. Это один пример qwidget:

import sys,os.path
from PyQt4 import QtGui, uic

class user_set(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        super(user_set, self).__init__()
        file_path = os.path.abspath("form_ui/user_form.ui")
        uic.loadUi(file_path, self)
        self.show()
        self.setFixedSize(self.size())
        self.move(QtGui.QApplication.desktop().screen().rect().center() - self.rect().center())
        sys.exit(app)

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    window = user_set()
    window.show()
    sys.exit(app.exec_())

Когда главное окно пытается запустить виджет, он мгновенно закрывается (виджет не главное окно). я вставил строку sys.exit(app)и виджет работает нормально, но в pycharm я получаю эту ошибку sys.exit(app) NameError: global name 'app' is not defined. Если я пытаюсь запустить только файл виджета, окна появляются и выходят instantlly, и я должен прокомментировать de sys.exit(app)line.

Есть ли у кого-то представление о том, что я сделал неправильно? Спасибо!

EDIT1——————————————————————-

это мой основной файл:

import os
import sys

from PyQt4 import QtGui, uic
import setup, modules


class MyWindow(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        super(MyWindow, self).__init__()
        file_path = os.path.abspath("form_ui/main_window.ui")
        uic.loadUi(file_path, self)
        self.show()
        self.statusBar().showMessage('Developer contact: admin.unu@protonmail.com')                #message on status bar of main window
        self.actionExit.triggered.connect(self.close)                                              #action to close main windows
        self.actionSetup.triggered.connect(self.run_dialog_setup)                               #action to run setup_guy.py
        self.actionUser.triggered.connect(self.run_dialog_user_set)                              #action to run user_form.py
        self.actionClient_check.triggered.connect(self.run_dialog_client_read)              #action to rin client_read.py
        self.actionClient_add.triggered.connect(self.run_dialog_client_make)                #action to run client_make.py
        self.actionEquipment_add.triggered.connect(self.run_dialog_add_equipment)         #action to run add_equipment.py
        self.actionOrders.triggered.connect(self.run_dialog_comanda)                           #action to run comanda.py
        self.actionServices.triggered.connect(self.run_dialog_add_services)                    #action to run services.py
        self.actionList_data.triggered.connect(self.run_dialog_list_data)                     #action to run list_data.py
        self.move(QtGui.QApplication.desktop().screen().rect().center()- self.rect().center())     #center main windows


    def run_dialog_user_set(self):
        dialog = modules.user_form.user_set()
        dialog.show()
        dialog.accept()
        sys.exit(dialog.exec_())
if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    # app.setQuitOnLastWindowClosed(False)
    # QtGui.QApplication.setQuitOnLastWindowClosed(False)
    window = MyWindow()
    window.show()
    sys.exit(app.exec_())

Мой второй файл это:

import sys,os.path
from PyQt4 import QtGui, uic

class user_set(QtGui.QDialog):
    def __init__(self):
        QtGui.QDialog.__init__(self)
        file_path = os.path.abspath("form_ui/user_form.ui")
        uic.loadUi(file_path, self)
        self.setFixedSize(self.size())
        self.move(QtGui.QApplication.desktop().screen().rect().center() - self.rect().center())

# if __name__ == '__main__':
#     app = QtGui.QApplication(sys.argv)
#     window = user_set()
#     window.show()
#     sys.exit(app.exec_())

Я пытался PYPL решение, и ошибка приложения была решена. я попробовал его последнее решение, но нет результатов, приложение по-прежнему закрывается. я установлю ссылку на видео youtube, чтобы увидеть, что я имею в виду.

PS: решение furas я не мог проверить его, потому что я не понял его, я новичок в pyhton и не носитель английского языка, извините.

Ссылка на Youtube: https://youtu.be/9F2-5NVaqvQ

1 ответ

  1. Вы инициализировали свой суперкласс дважды подряд в обоих классах!

    Изменить user_setсуперкласс на QtGui.QDialog

    import sys,os.path
    from PyQt4 import QtGui, uic
    
    class user_set(QtGui.QDialog):
        def __init__(self):
            QtGui.QWidget.__init__(self) init super [1]
            super(user_set, self).__init__() init super [2] -> GET RID OF THIS !!
            file_path = os.path.abspath("form_ui/user_form.ui")
            uic.loadUi(file_path, self)
            self.setFixedSize(self.size())
            self.move(QtGui.QApplication.desktop().screen().rect().center() - self.rect().center())
    

    Не следует вызывать .show()функцию класса__init__! вместо этого создайте другой метод, где вы создаете диалоговое окно и вызываете виджет из него

    class MyWindow(QtGui.QMainWindow):
        def __init__(self):
            QtGui.QWidget.__init__(self)
            file_path = os.path.abspath("form_ui/main_window.ui")
            uic.loadUi(file_path, self)
            self.statusBar().showMessage('Developer contact: admin.unu@protonmail.com')
            self.actionExit.triggered.connect(self.close)
            self.actionSetup.triggered.connect(setup.setup_gui.setupgui)
            self.actionUser.triggered.connect(self.run_dialog_user_set)
            self.actionClient_check.triggered.connect(modules.client_read.client_read_op)
            self.actionClient_add.triggered.connect(modules.client_make.client_make_op)
            self.actionEquipment_add.triggered.connect(modules.add_equipment.add_equipment_op)
            self.actionOrders.triggered.connect(modules.comanda.comanda_def)
            self.actionServices.triggered.connect(modules.services.add_services_op)
            self.actionList_data.triggered.connect(modules.list_data.list_data_op)
            self.move(QtGui.QApplication.desktop().screen().rect().center()- self.rect().center())
    
        def run_dialog_user_set(self):
            dialog = modules.user_form.user_set()
            dialog.show()