Conectar o sinal ao slot imediatamente faz com que o sinal seja emitido
Estou escrevendo um programa com python 3.3.3 e pyqt5. Conectei muitos sinais e slots sem nenhum problema. Este está causando um problema. Meu código a seguir:
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)
Esse código preenche caixas de combinação com fornecedores e modelos. A caixa de combinação do fornecedor é preenchida na inicialização. A caixa de combinação do modelo é preenchida com dados diferentes para cada fornecedor. Sempre que o usuário escolhe um fornecedor diferente, a caixa de combinação do modelo deve ser atualizada com uma lista diferente.
O que deve acontecer:
Quando o método populateVendorAndModelComboBoxes é chamado, a primeira parte do programa coloca a lista de fornecedores na caixa de combinação do fornecedor. Em seguida, será feita uma conexão entre o sinal currentTextChanged e o slot _vendorChanged. Em seguida, a função _vendorChanged deve ser chamada inicialmente para configurar a caixa de combinação Model. A partir de então, a função _vendorChanged deve ser chamada sempre que o usuário escolher um novo fornecedor.
O que está acontecendo:
Quando a conexão é estabelecida entre o sinal currentTextChanged e o slot _vendorChanged, a função _vendorChanged é chamada imediatamente. Não deve chamar imediatamente a função _vendorChanged. Isso não acontece com nenhuma das minhas outras conexões de sinal / slot. A função _vendorChanged é executada sem erro, o ponto de execução volta para a instrução vendorComboBox.currentTextChanged.connect .... e recebo imediatamente um erro TypeError: o argumento 1 tem um tipo inesperado 'NoneType'.
Se eu comentar a declaração que faz a conexão, o programa funcionará sem erros. A caixa de combinação do fornecedor é preenchida com fornecedores e a caixa de combinação do modelo é preenchida com modelos do primeiro fornecedor da lista. Isso indica que o código _vendorChanges está funcionando corretamente.
Eu tenho duas perguntas. Por que a instrução connect faz com que a função _vendorChanged seja executada imediatamente? Qual é a causa da mensagem de erro?