У меня есть проект python.и я новичок в pyqt4, но я столкнулся с проблемой и не смог найти решение. Мой проект имеет основной файл под названием main.py и содержание его заключается в следующем:python pyq4 выход виджета после выполнения файла
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: [email protected]') #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
. Если я попытаюсь запустить только файл виджетов, появятся окна и выйдут из контекстного меню, и я должен прокомментировать строку sys.exit(app)
.
Есть ли у кого-нибудь идеи, что я сделал не так? Спасибо
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: [email protected]') #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: решение фураса я не смог проверить, потому что я этого не понимал, я новичок в pyhton, а не на родном английском динамике, извините.
Youtube ссылка: https://youtu.be/9F2-5NVaqvQ
У вас есть 'sys.exit (app)' внутри виджета, поэтому он должен выйти сразу. Но если вы импортируете этот код, он не выполняет 'if __name__ == '__main __':' и не создает 'app' и' sys.exit (app) 'дает вам ошибку. Поместите много 'print()' в код, чтобы увидеть, какая часть выполнена. BTW: widgete не имеет доступа к 'app', созданному в основном файле. – furas
BTW: используйте имена 'CamelCase' для классов -' UserSet'. Кажется, вы используете имя класса в 'trigger.connect()', но оно может ожидать только функции/методы. – furas
Я просматриваю ваш комментарий, попробуйте его протестировать. я вернусь с ответом. –