2016-04-25 141 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