2016-04-25 100 views
1

我正在学习如何使用PyQt4,我似乎已经创建了一个简单的程序,当第一个窗口中的按钮被点击时,打开第二个窗口。我的问题是,我希望在第二个窗口打开时关闭第一个窗口。我在click事件中使用了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标签旁边添加一个'python'标签,这样所有的代码都会被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只调用您赢得的函数,您需要对main.py进行任何更改。

因为MyWindow继承自design.py中定义的Ui_MainWindow类,那么在MyWindow类中使用self.widgetName可以访问指定给该类中的self的所有窗口小部件 - 如果在MyWindow类中未找到widgetName,父类会搜索widgetName。

+0

非常感谢您的帮助。它运作良好,并提高了我的理解度 – AK27

+0

@ AK27,Wel ....我发布了三种不同的解释来说明为什么你的窗口不会关闭,我删除了它们,因为它们在进一步测试后证明是错误的。我真的无法解释为什么将'MainWindow.show()'改成'ui.show()'成功了 - 这减少了我的理解。 :( – 7stud