2017-01-13 2 views
0

У меня есть проект 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

+0

У вас есть 'sys.exit (app)' внутри виджета, поэтому он должен выйти сразу. Но если вы импортируете этот код, он не выполняет 'if __name__ == '__main __':' и не создает 'app' и' sys.exit (app) 'дает вам ошибку. Поместите много 'print()' в код, чтобы увидеть, какая часть выполнена. BTW: widgete не имеет доступа к 'app', созданному в основном файле. – furas

+0

BTW: используйте имена 'CamelCase' для классов -' UserSet'. Кажется, вы используете имя класса в 'trigger.connect()', но оно может ожидать только функции/методы. – furas

+0

Я просматриваю ваш комментарий, попробуйте его протестировать. я вернусь с ответом. –

ответ

0

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

Изменение 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: [email protected]') 
     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() 
+0

Я сделал ваши изменения, но окно открывается и закрывается мгновенно. Я меняю класс user_set на Qdialog. если я раскомментирую строку sys.exit (app) из класса user_set, откроется окно, но появится сообщение об ошибке в консоли. это ошибка: NameError: глобальное имя «приложение» не определено, никаких мыслей? –

+0

Проблема несколько решена, я немного поправил ваше решение. это то, что я использую: 'def run_dialog_user_set (self): dialog = modules.user_form.user_set() dialog.show() sys.exit (dialog.exec _())'.'user_set' открывается и stai открывается, но если я закрываю его, главное окно закрывается. –

+0

@BogdanRadu, возможно, это потому, что вы делаете 'self.move()' прямо внутри вашего диалога, где вы пытаетесь обратиться к qappliaction. Вместо '.move' вашего диалога прямо перед вызовом' dialog.show() 'в вашем' run_dialog_user_set' метод: 'dialog.move ()' – PYPL