2016-04-25 3 views
1

Я изучаю, как использовать PyQt4, и я, похоже, создал простую программу, которая открывает второе окно при нажатии кнопки в первом окне. Моя проблема в том, что я бы хотел, чтобы первое окно закрылось, когда открывается второе окно. Я использовал функцию self.close() в событии клика безрезультатно. Мне нужна помощь.Окно PyQt не закрывается

# -*- coding: utf-8 -*- 

# Form implementation generated from reading ui file 'uitest.ui' 
# 
# Created by: PyQt4 UI code generator 4.11.4 
# 
# WARNING! All changes made in this file will be lost! 

from PyQt4 import QtCore, QtGui 

try: 
    _fromUtf8 = QtCore.QString.fromUtf8 
except AttributeError: 
    def _fromUtf8(s): 
     return s 

try: 
    _encoding = QtGui.QApplication.UnicodeUTF8 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig, _encoding) 
except AttributeError: 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig) 

class Ui_MainWindow(QtGui.QMainWindow): 

    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 
     self.setupUi(self) 

    def setupUi(self, MainWindow): 
     MainWindow.setObjectName(_fromUtf8("MainWindow")) 
     MainWindow.setWindowModality(QtCore.Qt.NonModal) 
     MainWindow.resize(288, 242) 
     self.centralwidget = QtGui.QWidget(MainWindow) 
     self.centralwidget.setObjectName(_fromUtf8("centralwidget")) 
     self.pushButton = QtGui.QPushButton(self.centralwidget) 
     self.pushButton.setGeometry(QtCore.QRect(50, 50, 171, 101)) 
     self.pushButton.setObjectName(_fromUtf8("pushButton")) 
     #################################################################################### 
     self.pushButton.clicked.connect(self.ChangeUi) 
     ######################################################################## 
     MainWindow.setCentralWidget(self.centralwidget) 
     self.menubar = QtGui.QMenuBar(MainWindow) 
     self.menubar.setGeometry(QtCore.QRect(0, 0, 288, 21)) 
     self.menubar.setObjectName(_fromUtf8("menubar")) 
     MainWindow.setMenuBar(self.menubar) 
     self.statusbar = QtGui.QStatusBar(MainWindow) 
     self.statusbar.setObjectName(_fromUtf8("statusbar")) 
     MainWindow.setStatusBar(self.statusbar) 

     self.retranslateUi(MainWindow) 
     QtCore.QMetaObject.connectSlotsByName(MainWindow) 

    def retranslateUi(self, MainWindow): 
     MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None)) 
     self.pushButton.setText(_translate("MainWindow", "NEXT", None)) 

    def ChangeUi(self): 

     self.newUser = Ui_MainWindow1() 
     self.newUser.show() 


class Ui_MainWindow1(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 
     self.setupUi(self) 

    def setupUi(self, MainWindow1): 
     MainWindow1.setObjectName(_fromUtf8("MainWindow1")) 
     MainWindow1.resize(480, 265) 
     self.centralwidget = QtGui.QWidget(MainWindow1) 
     self.centralwidget.setObjectName(_fromUtf8("centralwidget")) 
     self.label = QtGui.QLabel(self.centralwidget) 
     self.label.setGeometry(QtCore.QRect(180, 70, 111, 71)) 
     font = QtGui.QFont() 
     font.setPointSize(15) 
     self.label.setFont(font) 
     self.label.setObjectName(_fromUtf8("label")) 
     MainWindow1.setCentralWidget(self.centralwidget) 
     self.menubar = QtGui.QMenuBar(MainWindow1) 
     self.menubar.setGeometry(QtCore.QRect(0, 0, 480, 21)) 
     self.menubar.setObjectName(_fromUtf8("menubar")) 
     MainWindow1.setMenuBar(self.menubar) 
     self.statusbar = QtGui.QStatusBar(MainWindow1) 
     self.statusbar.setObjectName(_fromUtf8("statusbar")) 
     MainWindow1.setStatusBar(self.statusbar) 

     self.retranslateUi(MainWindow1) 
     QtCore.QMetaObject.connectSlotsByName(MainWindow1) 

    def retranslateUi(self, MainWindow1): 
     MainWindow1.setWindowTitle(_translate("MainWindow1", "MainWindow", None)) 
     self.label.setText(_translate("MainWindow1", "IT WORKED", None)) 

if __name__ == "__main__": 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    MainWindow = QtGui.QMainWindow() 
    ui = Ui_MainWindow() 
    ui.setupUi(MainWindow) 
    MainWindow.show() 
    sys.exit(app.exec_()) 
+0

Надеюсь, вы не против, я отредактировал ваше сообщение, чтобы добавить тег 'python' (рядом с тегом' pyqt'), чтобы весь код в потоке был пропитан подсветкой синтаксиса python, что делает код легче читать. – 7stud

ответ

1

1) Вы делаете что-то в стиле фанк здесь:

if __name__ == "__main__": 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    MainWindow = QtGui.QMainWindow() 
    ui = Ui_MainWindow() 
    ui.setupUi(MainWindow) 
    MainWindow.show() 
    sys.exit(app.exec_()) 

Если изменить код, как показано ниже, первое окно закрывается:

if __name__ == "__main__": 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    MainWindow = QtGui.QMainWindow() 
    ui = Ui_MainWindow() 
    ui.setupUi(MainWindow) 
    #MainWindow.show() 
    ui.show() 
    sys.exit(app.exec_()) 

2) Этот код:

ui = Ui_MainWindow() 
ui.setupUi(MainWindow) 

вызывает setupUi() дважды, потому что создается Ui_MainWindow экземпляр вызывает setupUi() будет называться:

class Ui_MainWindow(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     ... 
     self.setupUi(self) 

3) Ваш конвертированы .ui файл выглядит поддатый:

class Ui_MainWindow(QtGui.QMainWindow): 

Мои конвертированы .ui файлы имеют класс подобное (Qt 4.8.6), но класс наследует от объекта - не QtGui.QMainWindow, что означает, что мой класс не является классом виджетов, а просто обычным классом, который содержит кучу данных и некоторые методы для создания виджетов. Вы изменили это? Возможно, в ответ на ошибку: AttributeError: 'Ui_MainWindow' object has no attribute 'close'?

Я не думаю, что вы должны вмешиваться в преобразованный файл .ui. Вместо этого создайте другой файл для своего кода и импортируйте преобразованный файл .ui, то есть файл .py, и вы можете вызвать методы, определенные там. Это позволяет вам вносить изменения в Qt Designer, а затем конвертировать измененный файл .ui в файл .py снова - без необходимости ничего менять в вашем программном файле. И делать это помешало бы вам совершить ошибку, которую вы сделали.

Ниже приведен упрощенный пример, состоящий из окна с кнопкой, которая закрывает окно. Та же ошибка, которую вы сделали, не позволит закрыть окно в этом приложении. Но с вашим кодом в виде отдельного файла из преобразованного файла .ui, посмотрите, что происходит:

design.py (нет изменений, внесенных в этот не конвертируются .ui файл):

# -*- coding: utf-8 -*- 

# Form implementation generated from reading ui file 'mainwindow.ui' 
# 
# Created by: PyQt4 UI code generator 4.11.4 
# 
# WARNING! All changes made in this file will be lost! 

from PyQt4 import QtCore, QtGui 

try: 
    _fromUtf8 = QtCore.QString.fromUtf8 
except AttributeError: 
    def _fromUtf8(s): 
     return s 

try: 
    _encoding = QtGui.QApplication.UnicodeUTF8 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig, _encoding) 
except AttributeError: 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig) 

class Ui_MainWindow(object): 
    def setupUi(self, MainWindow): 
     MainWindow.setObjectName(_fromUtf8("MainWindow")) 
     MainWindow.resize(568, 409) 
     self.centralwidget = QtGui.QWidget(MainWindow) 
     self.centralwidget.setObjectName(_fromUtf8("centralwidget")) 
     self.pushButton = QtGui.QPushButton(self.centralwidget) 
     self.pushButton.setGeometry(QtCore.QRect(230, 150, 110, 32)) 
     self.pushButton.setObjectName(_fromUtf8("pushButton")) 
     MainWindow.setCentralWidget(self.centralwidget) 
     self.menubar = QtGui.QMenuBar(MainWindow) 
     self.menubar.setGeometry(QtCore.QRect(0, 0, 568, 22)) 
     self.menubar.setObjectName(_fromUtf8("menubar")) 
     MainWindow.setMenuBar(self.menubar) 
     self.statusbar = QtGui.QStatusBar(MainWindow) 
     self.statusbar.setObjectName(_fromUtf8("statusbar")) 
     MainWindow.setStatusBar(self.statusbar) 

     self.retranslateUi(MainWindow) 
     QtCore.QMetaObject.connectSlotsByName(MainWindow) 

    def retranslateUi(self, MainWindow): 
     MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None)) 
     self.pushButton.setText(_translate("MainWindow", "Close window", None)) 

main.py (создание этот файл для вашего кода):

import sys 
import design 
from PyQt4.QtGui import QMainWindow, QApplication 

class MyWindow(QMainWindow, design.Ui_MainWindow): 
    def __init__(self): 
     super(MyWindow, self).__init__() 
     self.setupUi(self) 

     self.pushButton.clicked.connect(self.close_window) 

    def close_window(self): 
     self.close() 


app = QApplication(sys.argv) 
window = MyWindow() 
window.show() 
sys.exit(app.exec_()) 

Обратите внимание, что, поскольку вы создаете только одно окно, вы не можете показать неправильное окно. Кроме того, если вы решили изменить файл .ui (а затем снова скрывать его в файле .py), единственное, что изменится, - это код внутри функций, а поскольку main.py только вызывает функции, которые вы выиграли, t необходимо внести любые изменения в main.py.

Поскольку MyWindow наследуется от класса Ui_MainWindow, определенного в файле design.py, все виджеты, назначенные self в этом классе, доступны внутри класса MyWindow, используя self.widgetName - когда widgetName не найдено в классе MyWindow, его для родительских классов выполняется поиск имени widgetName.

+0

благодарит за помощь. он хорошо работает и улучшил мое понимание – AK27

+0

@ AK27, Wel .... Я разместил три разных объяснения, объясняющих, почему ваше окно не закрывается, и я удалил их все, потому что они оказались неправы после дальнейшего тестирования. Я действительно не могу объяснить, почему изменение 'MainWindow.show()' на 'ui.show()' successs - что уменьшило мое понимание. :( – 7stud

Смежные вопросы