PyQt "Class" 对象没有属性 "widget"

PyQt "Class" object has no attribute "widget"

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

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_())

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

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

在 添加新项目之前,您已经连接到 currentTextChanged 信号 ,并且由于函数 currentTextChanged 假定整个 ui已经创建(包括exportSetDelimiter_lbl),你得到属性错误。

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

所以,只需移动initUI末尾的信号连接,一切正常。

嗯...不。因为你没有为主要 window 设置 central widget 并试图在其上设置布局(这不是允许,因为 QMainWindow 具有私有且不可访问的布局)。
添加 QWidget,调用 self.setCentralWidget(someWidget) 并为 that 小部件创建布局。