Используя PyQt4, хотя я отключаю слот, он продолжает срабатывать - PullRequest
1 голос
/ 24 февраля 2012

Я хочу выполнить функцию в списке объектов и сохранить результаты. Моя проблема в приведенном ниже коде состоит в том, что, хотя я пытаюсь отключить все сигналы, функция C продолжает каким-то образом запускаться непрерывно. (отключить выходы False)

class object(...):
  def init(self):
    ...
    self.emit(SIGNAL('result(bool)', result)
    ...

class classA(...):
  def functionA(self):
    self.results=[]
    self.i=0
    self.object[...]=... # len(self.object)=n
    self.functionB()

  def functionB(self):
    self.connect(self.object[self.i], SIGNAL('result(bool)'), lambda bool: self.functionC(bool))
    self.object[self.i].init()

  def functionC(self, result):
    print self.disconnect(self.object[self.i], SIGNAL('result(bool)', lambda bool: self.functionC(bool)) # outputs False (why cannot I disconnect it?)
    self.i+=1
    self.results.append(result)
    if self.i==len(self.object):
      print "finish"
      self.i=0
      return
    self.functionB()

Кто-нибудь мог вообразить проблему? Спасибо

1 Ответ

3 голосов
/ 24 февраля 2012

Я не уверен, является ли ваш код просто примером или вы действительно используете лямбда-функции для своего слота. Если вы действительно используете лямбду, причина, скорее всего, в том, что лямбда-функции - это совершенно разные объекты между вашим подключением и отключением:

>>> fn1 = lambda bool: self.functionC(bool)
>>> fn2 = lambda bool: self.functionC(bool)
>>> print fn1, fn2
<function <lambda> at 0x1004a9320> <function <lambda> at 0x1004a9398>
>>> fn1 == fn2
False
>>> fn1 is fn2
False

Если pyqt хранит ссылки на функции и ищет ту, которую вы указали для отключения, он сообщит, что он не подключен. На самом деле вы хотите сослаться на постоянный обратный вызов. Либо сохраните лямбда-выражение в качестве атрибута-члена и оба раза ссылаетесь на него, либо определите его как стандартный метод или функцию.

...