2017-08-16 155 views
-1

更新的代碼片段: 我已更新爲'self'。約定而不是全局的,但仍然有唯一的值返回了在類級別上分配的空字符串,但是如果刪除了該字符串,則會引發錯誤。NameError:名稱未定義

class MainDialog(QWidget, qcDbWidget4.Ui_qcQueryWidget): 

    dbDir = '' 
    DbSelection = '' 
    dbPath = '' 
    TabSelection = '' 
    exportDir = '' 
    exportFileName = '' 

    def __init__(self, parent=None): 
     super(MainDialog, self).__init__(parent) 
     self.setupUi(self) 
     self.connect(self.dbDirSelect, SIGNAL("clicked()"), self.getDirFileNames) 
     self.connect(self.dbSelectButton, SIGNAL('clicked()'), self.selectDb) 
     self.connect(self.tabSelectButton, SIGNAL('clicked()'), self.selectTab) 
     self.connect(self.exportDirSelect, SIGNAL("clicked()"), self.getExportDir) 
     self.connect(self.exportButton, SIGNAL("clicked()"), self.setExportName) 
     self.connect(self.querySubmitButton, SIGNAL("clicked()"), self.setQueryParams) 
     self.connect(self.querySubmitButton, SIGNAL("clicked()"), self.dbQuery) 

    def getDirFileNames(self): 
     self.dbDir = str(QFileDialog.getExistingDirectory(self)) 
     self.dbDirDisplay.setText(self.dbDir) 

     dbFileList = [] 
     for root, dirs, files in os.walk(self.dbDir): 
      for file in files: 
       if file.endswith('.db'): 
        dbFileList.append(file) 

     self.dbSelection.addItems(dbFileList) 
+2

哪條線返回錯誤?你看過其他什麼答案? – jmoon

+3

請勿使用'global'。您可能正在尋找'self.qcLevelCode'。 – Ryan

+0

它似乎來自:queryStatement =「SELECT * FROM」+ qcTabSelect +「WHERE」+ qcLevelSelect向底部 – RGETLB

回答

2

當您在類級別定義變量一樣

class A(object): 
    c = '' 

您可以使用「C」作爲靜態類變量或實例變量(或兩者兼而有之,但它的混亂)。如果你想使用它作爲靜態類變量,你需要使用它作爲A.c(整個類的靜態變量,可以在實例方法之外訪問)。如果你想使用它作爲實例變量,你需要使用self.c(每個實例都有自己的變量)。 c作爲變量在這種情況下將不會被定義,如果您嘗試使用global c您應該有NameError。

+0

我一直在拋出一個錯誤,即如果變量未在類級別初始定義,那麼該變量未定義,然後設置爲全局重新分配。我如何將變量定義爲實例,賦值,然後在同一個類中的另一個方法中引用? – RGETLB

+0

self.qcLevelCode將等於定義的值(在你的情況下爲''),除非你在某處分配了某些東西。它可以在'__init__' - 構造函數中完成。在像'self.qcLevelCode =「LCU」'這樣的語句的任何方法中,或者如果您將實例賦予某個變量,如'inst' inst.qcLevelCode =「LCU」'。 – varela