1

我不断收到这个错误,我有点卡住了。我知道它与最后一段代码有关,但除此之外,我很困惑,我不确定如何修复它/实施修复。

调用 Panel 的部分(可视选项菜单的一部分):

    self.AutojoinMemosPanel = GUI.Options.Panels.AutojoinMemos.Panel(self.config,self)
    self.pages.addWidget(self.AutojoinMemosPanel)

控制板:

from PyQt4 import QtCore
from PyQt4 import QtGui

class MemoEntryItem(QtGui.QListWidgetItem):
def __init__(self,MemoName):
    QtGui.QListWidgetItem.__init__(self,MemoName)
    self.MemoName = MemoName

class Panel(QtGui.QWidget):
def __init__(self,Config,userprofile):
    QtGui.QWidget.__init__(self)
    self.Config = Config

    self.AutoIdentifyCheck = QtGui.QCheckBox("Automatically identify with nickserv")
    self.PasswordLabel = QtGui.QLabel("Password:")
    self.PasswordEntry = QtGui.QLineEdit()
    self.PasswordEntry.setEchoMode(QtGui.QLineEdit.Password)

    self.TitleLabel = QtGui.QLabel("Memos to join on startup:")
    self.MemosList = QtGui.QListWidget()
    self.MemoNameEntry = QtGui.QLineEdit()
    self.RemoveButton = QtGui.QPushButton("REMOVE")
    self.AddButton = QtGui.QPushButton("ADD")

    Layout = QtGui.QVBoxLayout(self)
    Layout.setAlignment(QtCore.Qt.AlignTop)
    Layout.addWidget(self.AutoIdentifyCheck)
    NickservPasswordLayout = QtGui.QHBoxLayout()
    NickservPasswordLayout.addWidget(self.PasswordLabel)
    NickservPasswordLayout.addWidget(self.PasswordEntry)
    Layout.addLayout(NickservPasswordLayout)
    Layout.addWidget(self.TitleLabel)
    Layout.addWidget(self.MemosList)
    Layout.addWidget(self.MemoNameEntry)
    AddRemoveButtonLayout = QtGui.QHBoxLayout()
    AddRemoveButtonLayout.addWidget(self.RemoveButton)
    AddRemoveButtonLayout.addWidget(self.AddButton)
    Layout.addLayout(AddRemoveButtonLayout)

    self.connect(self.RemoveButton,QtCore.SIGNAL("clicked()"),self,QtCore.SLOT("RemoveSelectedMemo()"))
    self.connect(self.AddButton,QtCore.SIGNAL("clicked()"),self,QtCore.SLOT("AddMemoFromTextEntry()"))

    if self.Config.userprofile.userprofile.get("AutoIdentify",False):
        self.AutoIdentifyCheck.setChecked(True)

    self.PasswordEntry.setText(self.Config.userprofile.userprofile.get("NickservPassword",""))

    for MemoName in self.Config.config.get("AutojoinMemos",[]):
        self.AddMemoEntry(MemoName)

@QtCore.pyqtSlot()
def RemoveSelectedMemo(self):
    self.MemosList.takeItem(self.MemosList.currentRow())

@QtCore.pyqtSlot()
def AddMemoFromTextEntry(self):
    MemoName = str(self.MemoNameEntry.text()).strip()
    if (MemoName != ""):
        self.AddMemoEntry(MemoName)
        self.MemoNameEntry.setText("")

def AddMemoEntry(self,MemoName):
    self.MemosList.addItem(MemoEntryItem(MemoName))

def SaveOptions(self):
    MemosListed = []

    for MemoIndex in range(self.MemosList.count()):
        MemoItem = self.MemosList.item(MemoIndex)
        MemosListed.append(MemoItem.MemoName)

    self.Config.set("AutojoinMemos",MemosListed)

    self.Config.userprofile.userprofile["AutoIdentify"] = self.AutoIdentifyCheck.isChecked()
    self.Config.userprofile.userprofile["NickservPassword"] = str(self.PasswordEntry.text())
    self.Config.userprofile.save()

有什么帮助吗?

4

1 回答 1

3

乍一看,这里可能会发生两件事之一。经过深入检查,只有一个。

让我们假设,由于您没有明确说明,有问题的行是:

if self.Config.userprofile.userprofile.get("AutoIdentify",False):  

然后当你得到错误

AttributeError: 'NoneType' object has no attribute 'userprofile'

表示您正在尝试访问不存在的属性(这是 背后的含义has no attribute 'userprofile'),并且您正在检查属性的对象不存在,因为不存在的对象的类型是NoneType(这就是后面的意思'NoneType' object)。

因此,要进行调试,您需要寻找对象访问的可能性userprofileNone即未分配或为空)。这可以在

self.Config.userprofile #1

self.Config.userprofile.userprofile #2  

在 #1 中,如果 Config 的值为None,那么self.Config.userprofile将抛出 AttributeError 因为Config是一个NoneType对象,因此没有属性——更不用说userprofile属性了。

在 #2 中,如果 of 的值为userprofile is self.CongigNone则将self.Config.userprofile.userprofile抛出 AttributeError ,因为userprofile它是一个NoneType对象,因此也没有属性。

但是,您可以消除这两个选项之一。

想想看,#2 永远不会抛出这个错误,因为如果userprofile对象的属性self.ConfigNone(如上所述),那么你首先会抛出一个不同的错误:

AttributeError: 'Config' object has no attribute 'userprofile'

如果Config对象确实有一个属性userprofile,那么你会得到错误:

AttributeError: 'userprofile' object has no attribute 'userprofile'

因此,Configmust be None,这意味着您没有传入Configto 的值__init__

希望这有助于解决您的问题并更好地自行调试!

于 2013-07-09T22:18:49.657 回答