PyQt: Comment connecter QComboBox de fonction avec des Arguments
QComboBox est associé à une fonction en utilisant la syntaxe suivante:
myComboBox.activated.connect(self.myFunction )
Mais j'ai besoin d'être en mesure d'envoyer les arguments de la zone de liste déroulante à myFunction(). Mais si j'utilise:
myComboBox.activated.connect(self.myFunction(myArg1, myArg2 )
Je suis
TypeError: connect() slot argument should be a callable or a signal, not 'NoneType'
Ce que la syntaxe doit être utilisé pour connecter un QComboBox à une fonction qui est capable de recevoir des arguments envoyés à partir de Comobobox?
ÉDITÉ PLUS TARD:
Voici le code résultant d'une erreur TypeError:
connect() slot argument should be a callable or a signal, not 'NoneType'
from PyQt4 import QtCore, QtGui
import sys
class MyClass(object):
def __init__(self, arg):
super(MyClass, self).__init__()
self.arg = arg
class myWindow(QtGui.QWidget):
def __init__(self, parent=None):
super(myWindow, self).__init__(parent)
self.comboBox = QtGui.QComboBox(self)
self.comboBox.addItems([str(x) for x in range(3)])
self.myObject=MyClass(id(self) )
self.comboBox.activated.connect(self.myFunction(self.myObject, 'someArg'))
def myFunction(self, arg1=None, arg2=None):
print '\n\t myFunction(): ', type(arg1),type(arg2)
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
app.setApplicationName('myApp')
dialog = myWindow()
dialog.show()
sys.exit(app.exec_())
- double possible de Créer un bouton dynamique en PyQt
- Regarder prendre votre code et de modifier
self.comboBox.activated.connect(self.myFunction(self.myObject, 'someArg'))
parself.comboBox.activated.connect(self.myFunction)
il fonctionne parfaitement pour moi. Comme je l'ai dit, vous n'avez pas besoin de spécifier les arguments lors de la connexion de la fente. - J'ai besoin de spécifier les arguments lors de la connexion de la fente. Si je n'ai pas de spécifier les arguments lors de la connexion de la fente comment je pourrais être en mesure d'envoyer les arguments de la fonction? Il est très simple si il n'y aurait pas besoin d'arguments pour envoyé. Mais dans ce cas, les arguments doivent être spécifiés lors de la connexion de la fente.
- Je pense que vous avez mal compris la façon dont les signaux et les slots œuvres. Vous ne POUVEZ PAS envoyer arbitraire
types
d'arguments sur un signal spécifique. Le signalactivate
deQComboBox
est rependu avec unint
voir: pyqt.sourceforge.net/Docs/PyQt4/qcombobox.html#activated. Donc, vous devez définir vous-mêmes des signaux, un signal qui émettent que des types de valeur que vous voulez (MyClass
pour l'auto.myObject etstr
poursomeArg
). Et puis vous pouvez émettent votre signal à partir de la fonction qui gèreactivate
événement. et bien sûr, vous-mêmes des signaux a besoin d'un maître-chien/logement trop. - Le haut-signaux de savoir (c'est prédéfinie) combien et quelle types d'arguments vont être envoyés aux machines à sous. La seule chose que vous avez à faire est de mettre en œuvre un logement prêt à recevoir de tels arguments. Si le signal n'est pas traite avec le type d'arguments que vous avez besoin, et bien, encore une fois, vous avez besoin d'un signal personnalisé.
- D'accord avec votre point de vue. Mais si le Signal personnalisé + Fente n'est pas l'option, puis lambda est la réponse à une telle situation (quand il y a un besoin d'envoyer des arguments à la fonction).
- Il serait intéressant de voir comment un Signal personnalisé/Logement et de leur connexion à l'arbitraire widget de tous pourrait être atteint. Veuillez poster quelques exemple simplifié. Et la capacité à envoyer les arguments vers le bas pour fonction serait un bonus.
- tout en essayant de passer des arguments à
myFunction
vous l'avez appelé alorsNone
est transmis àconnect
au lieu demyFunction
lui-même. La solution a été de placer l'appel avec un ad hoc de la fonction et de la transmettre à la place:lambda: self.myFunction(self.myObject, 'someArg')
. C'est assez standard façon de résoudre ce problème. Vous souhaitez faire de la même façon par exempletkinter
Vous devez vous connecter pour publier un commentaire.
Après que j'ai posté une question Stachoverflow suggéré un lien qui explique beaucoup de choses. Voici la réponse:
connect
méthode attend un objet de fonction passée mais OP réellement passéNone
à elle (tout en essayant de passer des arguments à sa fonction, effectivement, il l'a appelé). La solution la plus simple était d'enveloppermyFunction
appelé avec ses arguments de manière ad hoc:lambda: self.myFunction(self.myObject, 'someArg')
mais au lieu de cela vous avez un peu déraillé la question pointant vers des slots et signaux mécanisme lorsque ce @alphanumérique besoin d'un simple rappel.