我正在用 python 3.3.3 和 pyqt5 编写一个程序。我已经连接了许多信号和插槽,没有问题。这导致了一个问题。我的代码如下:
def populateVendorAndModelComboBoxes(self, vendorComboBox, modelComboBox):
dictVendors = {}
#for rclass in sorted(list(directory.DRV_TO_RADIO.values())):
for rclass in list(directory.DRV_TO_RADIO.values()):
if not issubclass(rclass, chirp_common.CloneModeRadio) and \
not issubclass(rclass, chirp_common.LiveRadio):
continue
if not rclass.VENDOR in dictVendors:
dictVendors[rclass.VENDOR] = []
dictVendors[rclass.VENDOR].append(rclass)
vendorComboBox.addItems(sorted(list(dictVendors)))
def _vendorChanged(vendorCBox, vendorsDict, modelCBox):
modelsList = vendorsDict[vendorCBox.currentText()]
added_models = []
modelCBox.clear()
for rclass in modelsList:
if rclass.MODEL not in added_models:
added_models.append(rclass.MODEL)
print("adding to modelCB")
modelCBox.addItems(sorted(added_models))
print("Done adding to modelCB")
vendorComboBox.currentTextChanged.connect(_vendorChanged(vendorComboBox, dictVendors, modelComboBox))
_vendorChanged(vendorComboBox, dictVendors, modelComboBox)
此代码使用供应商和模型填充组合框。供应商组合框在启动时填充。模型组合框填充了每个供应商的不同数据。每次用户选择不同的供应商时,必须使用不同的列表更新模型组合框。
应该发生什么:
当调用方法 populateVendorAndModelComboBoxes 时,程序的第一部分将供应商列表放入供应商组合框中。然后将在 currentTextChanged 信号和 _vendorChanged 插槽之间建立连接。然后应该首先调用 _vendorChanged 函数来设置模型组合框。从那时起,每当用户选择新的供应商时,都应该调用 _vendorChanged 函数。
怎么了:
当 currentTextChanged 信号和 _vendorChanged 插槽之间建立连接时,会立即调用 _vendorChanged 函数。它不应立即调用 _vendorChanged 函数。我的任何其他信号/插槽连接都不会发生这种情况。_vendorChanged 函数执行没有错误,然后执行点返回到 vendorComboBox.currentTextChanged.connect.... 语句,我立即收到错误 TypeError: argument 1 has unexpected type 'NoneType'。
如果我注释掉建立连接的语句,程序就可以正常工作。供应商组合框填充了供应商,模型组合框填充了列表中第一个供应商的模型。这表明 _vendorChanges 代码工作正常。
我有两个问题。为什么 connect 语句会导致 _vendorChanged 函数立即执行?错误信息的原因是什么?