首页 > 解决方案 > PyQt“类”对象没有属性“小部件”

问题描述

在 PyQt 中,我有一个基本程序。它由 2 个组合框、1 个行编辑和 3 个复选框组成。我想要做的是,根据第一个组合框的项目,隐藏/显示特定的小部件。但是,我不断收到错误:'ExportDialog' object has no attribute 'exportSetDelimiter_lbl'. I have defined this widget above in initUI , and I run initUI ininit `,所以我不确定为什么会收到此错误。这是我的代码:

from PyQt5 import QtGui, QtCore, QtWidgets
import sys

class ExportDialog(QtWidgets.QMainWindow):
    def __init__(self,imagePath):
        super(ExportDialog, self).__init__()

        self.initUI(imagePath)

        #Set The GUI Position And Size
        self.setGeometry(500, 500, 600, 450)

        #Set The GUI Title
        self.setWindowTitle("Export Deck")

        #Set The GUI Icon
        self.setWindowIcon(QtGui.QIcon('MainFlashcardAppIcon.png'))
        
    def initUI(self, PATH):
        #Create The New Deck Label
        self.exportFormat_lbl = QtWidgets.QLabel(self)
        self.exportFormat_lbl.setText("Export Format: ")
        
        exportFormat_font = QtGui.QFont()
        exportFormat_font.setPointSize(8)
        
        self.exportFormat_lbl.setFont(exportFormat_font)
        self.exportFormat_lbl.adjustSize()

        self.exportFormat_combo = QtWidgets.QComboBox()
        self.exportFormat_combo.setMinimumHeight(35)
        self.exportFormat_combo.setFixedWidth(380)

        self.exportFormat_combo.currentTextChanged.connect(self.on_combobox_changed)

        self.exportDeckName_lbl = QtWidgets.QLabel(self)
        self.exportDeckName_lbl.setText("Include: ")
        
        self.exportDeckName_lbl.setFont(exportFormat_font)
        self.exportDeckName_lbl.adjustSize()

        self.exportDeckName_combo = QtWidgets.QComboBox()
        self.exportDeckName_combo.setMinimumHeight(35)
        self.exportDeckName_combo.setFixedWidth(380)


        self.exportFormat_combo.addItem(".TXT")
        self.exportFormat_combo.addItem(".CSV")
        self.exportFormat_combo.addItem(".DB")


        self.exportSetDelimiter_lbl = QtWidgets.QLabel()
        self.exportSetDelimiter_lbl.setText("Set Delimiter (Leave blank for standard delimited):")

        self.exportSetDelimiter_txt = QtWidgets.QLineEdit()
        self.exportSetDelimiter_txt.setMaxLength(1)

        self.exportSetDelimiter = QtWidgets.QLineEdit()

        vboxExport_setDelimiter = QtWidgets.QVBoxLayout()
        vboxExport_setDelimiter.addWidget(self.exportSetDelimiter_lbl)
        vboxExport_setDelimiter.addWidget(self.exportSetDelimiter_txt)

        self.includeMedia_check = QtWidgets.QCheckBox("Include HTML and Media References")
        self.includeTags_check = QtWidgets.QCheckBox("Include Tags")

        self.includeAllSQL_check = QtWidgets.QCheckBox("Include All SQL Tables")

        self.exportFormat_combo.addItem("B3 Biology")
        self.exportFormat_combo.addItem("B2 Biology")
        self.exportFormat_combo.addItem("B1 Biology")

        self.allComboList = ["B3 Biology", "B2 Biology", "B1 Biology"]

        self.exportDeckName_combo.setCurrentIndex(self.allComboList.index(PATH))

        #Create Confirm Button
        self.confirmButton = QtWidgets.QPushButton(self)
        self.confirmButton.setText("OK")

        self.confirmButton.clicked.connect(self.createDeck)

        #Create Cancel Button
        self.cancelButton = QtWidgets.QPushButton(self)
        self.cancelButton.setText("Cancel")

        self.cancelButton.clicked.connect(self.close)

        hboxExportFormat = QtWidgets.QHBoxLayout()
        hboxExportFormat.addWidget(self.exportFormat_lbl)
        hboxExportFormat.addStretch()
        hboxExportFormat.addWidget(self.exportFormat_combo)

        hboxExportName = QtWidgets.QHBoxLayout()
        hboxExportName.addWidget(self.exportDeckName_lbl)
        hboxExportName.addStretch()
        hboxExportName.addWidget(self.exportDeckName_combo)

        hboxButtonsBottom = QtWidgets.QHBoxLayout()
        hboxButtonsBottom.addStretch()
        hboxButtonsBottom.addWidget(self.confirmButton)
        hboxButtonsBottom.addWidget(self.cancelButton)

        #Create The VBoxLayout
        mainLayout = QtWidgets.QVBoxLayout(self)
        mainLayout.addLayout(hboxExportFormat)
        mainLayout.addLayout(hboxExportName)
        mainLayout.addLayout(vboxExport_setDelimiter)
        mainLayout.addWidget(self.includeMedia_check)
        mainLayout.addWidget(self.includeTags_check)
        mainLayout.addWidget(self.includeAllSQL_check)
        mainLayout.addStretch()
        mainLayout.addLayout(hboxButtonsBottom)

    def on_combobox_changed(self, i):
        if i == ".TXT":
            self.exportSetDelimiter_lbl.show()
            self.exportSetDelimiter_txt.show()

            self.includeMedia_check.show()
            self.includeTags_check.show()

            self.includeAllSQL_check.hide()
        elif i == ".CSV":
            self.exportSetDelimiter_lbl.hide()
            self.exportSetDelimiter_txt.hide()

            self.includeMedia_check.show()
            self.includeTags_check.show()

            self.includeAllSQL_check.hide()
        elif i == ".DB":
            self.exportSetDelimiter_lbl.hide()
            self.exportSetDelimiter_txt.hide()

            self.includeMedia_check.show()
            self.includeTags_check.show()

            self.includeAllSQL_check.show()

    def createDeck(self):
        print("Exported Sucessfully")
        self.close()


#Create A Windows
app = QtWidgets.QApplication(sys.argv)

window = ExportDialog("B1 Biology")
window.show()

sys.exit(app.exec_())

这是我的第一个问题,所以如果您需要任何其他信息,我会添加它。任何帮助将不胜感激。谢谢!

标签: pythonpython-3.xqtpyqtpyqt5

解决方案


新创建组合框时,它的当前索引 ( -1) 无效且没有当前文本集。添加第一个项目后,索引会自动更新为0,并且当前文本更改为该项目的文本。

您在添加新项目之前已连接到currentTextChanged信号,并且由于该函数假定整个 ui 已创建(包括),因此您会收到属性错误。currentTextChangedexportSetDelimiter_lbl

虽然没有放置信号连接的规则,但在创建它们的函数末尾对所有连接进行分组通常是一个好习惯,或者无论如何,确保它们的连接所需的所有内容都已创建。

因此,只需在末尾移动信号连接,initUI一切都会正常工作。

嗯...不。因为您没有为主窗口设置中央小部件并尝试在其上设置布局(这是不允许的,因为 QMainWindow 具有私有且不可访问的布局)。
添加一个 QWidget,调用并为该self.setCentralWidget(someWidget)小部件创建布局。


推荐阅读