Make a pushButton close a Qdialog

1

Clicking on QPushButton gives the following error:

Traceback (most recent call last):
  File "listageneral.py", line 59, in adios
    self.close()
AttributeError: 'Ui_Dialog' object has no attribute 'close'

This is the code:

import sys
from PyQt4 import QtCore, QtGui, uic
import sqlite3
form_class = uic.loadUiType("listageneral.ui")[0]
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_Dialog(object):
    def iniciarbase(self):
        with sqlite3.connect('condo3.db') as con:
            cursor = con.cursor()
            cursor.execute("SELECT * FROM aptos")
            self.lista.setRowCount(0)
            for row_number, row_data in enumerate(cursor):
                self.lista.insertRow(row_number)
                for column_number, data in enumerate(row_data):
                    self.lista.setItem(row_number, column_number, QtGui.QTableWidgetItem(str(data)))
                    self.lista.resizeColumnToContents(column_number)

    def setupUi(self, Dialog):
        Dialog.setObjectName(_fromUtf8("Dialog"))
        Dialog.resize(750, 580)
        self.pushButton = QtGui.QPushButton(Dialog)
        self.pushButton.setGeometry(QtCore.QRect(210, 540, 75, 23))
        self.pushButton.setObjectName(_fromUtf8("pushButton"))
        self.lista = QtGui.QTableWidget(Dialog)
        self.lista.setGeometry(QtCore.QRect(30, 50, 700, 461))
        self.lista.setRowCount(111)
        self.lista.setColumnCount(4)
        self.lista.setObjectName(_fromUtf8("lista"))
        self.label = QtGui.QLabel(Dialog)
        self.label.setGeometry(QtCore.QRect(100, 0, 301, 31))
        self.label.setObjectName(_fromUtf8("label"))
        QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL('clicked()'),self.adios)
        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)
        self.iniciarbase()

    def adios(self):
        self.close()
    def retranslateUi(self, Dialog):
        Dialog.setWindowTitle(_translate("Dialog", "Dialog", None))
        self.pushButton.setText(_translate("Dialog", "Cerrar", None))
        self.label.setText(_translate("Dialog", "<html><head/><body><p><span style=\" font-size:16pt;\">Listado General de Propietarios</span></p></body></html>", None))


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    Dialog = QtGui.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec_())

Edit:

When trying to apply Dialog.close() in the QMainWindow I get the following error:

 Traceback (most recent call last):
    File "C:\Users\marco\Downloads\Python\PyQt\Condominio\listagenera‌​l.py", line 59, in adios
         Dialog.close()
  NameError: name 'Dialog' is not defined

This is the code:

from PyQt4 import QtCore, QtGui
from listageneral import *
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 dialogo(self, checked=None):
        if checked==None: return
        dialog = QtGui.QDialog()
        dialog.ui = Ui_Dialog()
        dialog.ui.setupUi(dialog)
        dialog.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        dialog.exec_()

    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(714, 600)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.tabWidget = QtGui.QTabWidget(self.centralwidget)
        self.tabWidget.setGeometry(QtCore.QRect(20, 40, 661, 401))
        self.tabWidget.setObjectName(_fromUtf8("tabWidget"))
        self.tab = QtGui.QWidget()
        self.tab.setObjectName(_fromUtf8("tab"))
        self.listgen = QtGui.QPushButton(self.tab)
        self.listgen.setGeometry(QtCore.QRect(30, 60, 75, 23))
        self.listgen.setObjectName(_fromUtf8("listgen"))
        self.listgen.clicked.connect(self.dialogo)      
        self.tabWidget.addTab(self.tab, _fromUtf8(""))
        self.tab_2 = QtGui.QWidget()
        self.tab_2.setObjectName(_fromUtf8("tab_2"))
        self.tabWidget.addTab(self.tab_2, _fromUtf8(""))
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtGui.QStatusBar(MainWindow)
        self.statusbar.setObjectName(_fromUtf8("statusbar"))
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        self.tabWidget.setCurrentIndex(0)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
        self.listgen.setText(_translate("MainWindow", "Lista General", None))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Consulta", None))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Tab 2", 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_())
    
asked by Marco Salazar 05.10.2017 в 19:48
source

1 answer

0

Your class UI_Dialog is not a QtDialog nor does it inherit from it and neither has the close method implemented. If you want to close your instance Dialog you must use its method:

def adios(self):
    Dialog.close()

Edit:

You should make everything concerning your QtDialog be in your class UI_Dialog , not in your main window. However, without modifying your idea a lot you should parsar the object QtDialog to your class UI_Dialog when instantiating it:

from PyQt4 import QtCore, QtGui
from listageneral import *


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 dialogo(self, checked=None):
        if checked==None: return
        dialog = QtGui.QDialog()
        dialog.ui = Ui_Dialog(dialog)
        dialog.ui.setupUi()
        dialog.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        dialog.exec_()

    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(714, 600)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.tabWidget = QtGui.QTabWidget(self.centralwidget)
        self.tabWidget.setGeometry(QtCore.QRect(20, 40, 661, 401))
        self.tabWidget.setObjectName(_fromUtf8("tabWidget"))
        self.tab = QtGui.QWidget()
        self.tab.setObjectName(_fromUtf8("tab"))
        self.listgen = QtGui.QPushButton(self.tab)
        self.listgen.setGeometry(QtCore.QRect(30, 60, 75, 23))
        self.listgen.setObjectName(_fromUtf8("listgen"))
        self.listgen.clicked.connect(self.dialogo)      
        self.tabWidget.addTab(self.tab, _fromUtf8(""))
        self.tab_2 = QtGui.QWidget()
        self.tab_2.setObjectName(_fromUtf8("tab_2"))
        self.tabWidget.addTab(self.tab_2, _fromUtf8(""))
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtGui.QStatusBar(MainWindow)
        self.statusbar.setObjectName(_fromUtf8("statusbar"))
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        self.tabWidget.setCurrentIndex(0)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
        self.listgen.setText(_translate("MainWindow", "Lista General", None))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Consulta", None))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Tab 2", 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_())

Your class UI_Dialog should be:

class Ui_Dialog(object):
    def __init__(self,  dialog):
        self.dialog = dialog

    def iniciarbase(self):
        with sqlite3.connect('condo3.db') as con:
            cursor = con.cursor()
            cursor.execute("SELECT * FROM aptos")
            self.lista.setRowCount(0)
            for row_number, row_data in enumerate(cursor):
                self.lista.insertRow(row_number)
                for column_number, data in enumerate(row_data):
                    self.lista.setItem(row_number, column_number, QtGui.QTableWidgetItem(str(data)))
                    self.lista.resizeColumnToContents(column_number)

    def setupUi(self):
        self.dialog.setObjectName(_fromUtf8("Dialog"))
        self.dialog.resize(750, 580)
        self.pushButton = QtGui.QPushButton(self.dialog)
        self.pushButton.setGeometry(QtCore.QRect(210, 540, 75, 23))
        self.pushButton.setObjectName(_fromUtf8("pushButton"))
        self.lista = QtGui.QTableWidget(self.dialog)
        self.lista.setGeometry(QtCore.QRect(30, 50, 700, 461))
        self.lista.setRowCount(111)
        self.lista.setColumnCount(4)
        self.lista.setObjectName(_fromUtf8("lista"))
        self.label = QtGui.QLabel(self.dialog)
        self.label.setGeometry(QtCore.QRect(100, 0, 301, 31))
        self.label.setObjectName(_fromUtf8("label"))
        QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL('clicked()'),self.adios)
        self.retranslateUi()
        QtCore.QMetaObject.connectSlotsByName(self.dialog)
        self.iniciarbase()

    def adios(self):
        self.dialog.close()
    def retranslateUi(self):
        self.dialog.setWindowTitle(_translate("Dialog", "Dialog", None))
        self.pushButton.setText(_translate("Dialog", "Cerrar", None))
        self.label.setText(_translate("Dialog", "<html><head/><body><p><span style=\" font-size:16pt;\">Listado General de Propietarios</span></p></body></html>", None))

As I say it is generally encapsulating the code properly, "let the QDialog take care of yours and the class of the main window of yours". Another possible implementation would be:

from PyQt4 import QtCore, QtGui
from listageneral import *

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):
        super(Ui_MainWindow, self).__init__(parent)
        self.setupUi()

    def setupUi(self):
        self.setObjectName(_fromUtf8("MainWindow"))
        self.resize(714, 600)
        self.centralwidget = QtGui.QWidget(self)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.tabWidget = QtGui.QTabWidget(self.centralwidget)
        self.tabWidget.setGeometry(QtCore.QRect(20, 40, 661, 401))
        self.tabWidget.setObjectName(_fromUtf8("tabWidget"))
        self.tab = QtGui.QWidget()
        self.tab.setObjectName(_fromUtf8("tab"))
        self.listgen = QtGui.QPushButton(self.tab)
        self.listgen.setGeometry(QtCore.QRect(30, 60, 75, 23))
        self.listgen.setObjectName(_fromUtf8("listgen"))
        self.listgen.clicked.connect(self.dialogo)      
        self.tabWidget.addTab(self.tab, _fromUtf8(""))
        self.tab_2 = QtGui.QWidget()
        self.tab_2.setObjectName(_fromUtf8("tab_2"))
        self.tabWidget.addTab(self.tab_2, _fromUtf8(""))
        self.setCentralWidget(self.centralwidget)
        self.statusbar = QtGui.QStatusBar(self)
        self.statusbar.setObjectName(_fromUtf8("statusbar"))
        self.setStatusBar(self.statusbar)
        self.show()

        self.retranslateUi()
        self.tabWidget.setCurrentIndex(0)
        QtCore.QMetaObject.connectSlotsByName(self)

    def dialogo(self, checked=None):
        if checked==None: return
        Ui_Dialog()

    def retranslateUi(self):
        self.setWindowTitle(_translate("MainWindow", "MainWindow", None))
        self.listgen.setText(_translate("MainWindow", "Lista General", None))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Consulta", None))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Tab 2", None))


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

Your class Ui_Dialog would be something like this:

class Ui_Dialog(QtGui.QDialog):
    def __init__(self, parent = None):
        super(Ui_Dialog, self).__init__(parent)
        self.setupUi()

    def iniciarbase(self):
        with sqlite3.connect('condo3.db') as con:
            cursor = con.cursor()
            cursor.execute("SELECT * FROM aptos")
            self.lista.setRowCount(0)
            for row_number, row_data in enumerate(cursor):
                self.lista.insertRow(row_number)
                for column_number, data in enumerate(row_data):
                    self.lista.setItem(row_number, column_number, QtGui.QTableWidgetItem(str(data)))
                    self.lista.resizeColumnToContents(column_number)

    def setupUi(self):
        self.setObjectName(_fromUtf8("Dialog"))
        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        self.resize(750, 580)
        self.pushButton = QtGui.QPushButton(self)
        self.pushButton.setGeometry(QtCore.QRect(210, 540, 75, 23))
        self.pushButton.setObjectName(_fromUtf8("pushButton"))
        self.lista = QtGui.QTableWidget(self)
        self.lista.setGeometry(QtCore.QRect(30, 50, 700, 461))
        self.lista.setRowCount(111)
        self.lista.setColumnCount(4)
        self.lista.setObjectName(_fromUtf8("lista"))
        self.label = QtGui.QLabel(self)
        self.label.setGeometry(QtCore.QRect(100, 0, 301, 31))
        self.label.setObjectName(_fromUtf8("label"))
        QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL('clicked()'),self.adios)
        self.retranslateUi()
        QtCore.QMetaObject.connectSlotsByName(self)
        self.iniciarbase()
        self.exec_()

    def adios(self):
        self.close()

    def retranslateUi(self):
        self.setWindowTitle(_translate("Dialog", "Dialog", None))
        self.pushButton.setText(_translate("Dialog", "Cerrar", None))
        self.label.setText(_translate("Dialog", "<html><head/><body><p><span style=\" font-size:16pt;\">Listado General de Propietarios</span></p></body></html>", None))
    
answered by 05.10.2017 / 20:28
source