[prev in list] [next in list] [prev in thread] [next in thread]
List: pykde
Subject: Re: [PyKDE] PyQt not refing slot methods - bug?
From: "Burley, Brent" <Brent.Burley () disney ! com>
Date: 2002-08-30 15:51:37
[Download RAW message or body]
Boudewijn Rempt wrote:
> On Thursday 29 August 2002 21:02, Burley, Brent wrote:
> > Is it a bug that PyQt isn't refing slot methods? Doesn't anyone use
> > lambdas for slots?
>
> I don't think it's a bug -- it's certainly behaviour I would expect of
> PyQt, and no, I never use lambda's for slots. I feel a bit silly right now,
> because I can't think why using lambda is better than:
>
> def hello(): print 'hello'
> QObject.connect(b, SIGNAL('clicked()'), hello)
I use lambda in a callback when I want to bind arguments to it. Consider:
import sys
from qt import *
def buttonPressed(n): print 'button %d pressed' %n
app = QApplication(sys.argv)
box = QVBox()
lambdaRefs = []
for i in range(1,11):
b = QPushButton(str(i), box)
l = lambda i=i: buttonPressed(i)
lambdaRefs.append(l) # keep ref since Pyqt won't
QObject.connect(b, SIGNAL('clicked()'), l)
app.setMainWidget(box)
box.show()
app.exec_loop()
If you don't use lambda, you either have to subclass the pushbutton or make a \
separate function object for each button. Lambda is often simpler. Note: if you \
were to use a function object, you would have the same problem as with the lambda in \
that you would have to hold the reference yourself.
Lambdas are often used in Tkinter code for this purpose and Tkinter does in fact ref \
the lambda. Here's a page describing this: \
http://effbot.org/zone/tkinter-callbacks.htm Also, John Grayson discusses it and \
uses it extensively in "Python and Tkinter Programming".
The fact that PyQt doesn't ref the slot method means that the common lambda/command \
object callback idiom does not work. This sort of behavior creates bugs that can be \
very difficult to find. [There's a similar behavior in Tkinter where setting an \
image on a label doesn't ref the image; this caused me a great deal of grief!]
Given that the behavior of PyQt is as intended (and Phil's justification seems \
reasonable), and given that the use of lambdas (or command objects) is natural and \
common, especially for people coming from Tkinter, perhaps a note on the PyQt Signals \
and Slots page is warranted.
Brent
_______________________________________________
PyKDE mailing list PyKDE@mats.gmd.de
http://mats.gmd.de/mailman/listinfo/pykde
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic