[PyKDE] dcop
Jim Bublitz
jbublitz at nwinternet.com
Wed May 26 06:56:01 BST 2004
On Tuesday 25 May 2004 20:22, Amand Tihon wrote:
> Hello,
>
> I've been playing with pyKDE and DCOP these last few days, and I must say
> it is not really easy. The main problem being I haven't been able to find
> any documentation (as soon as I have something working, I'll put it on the
> wiki).
>
> Up to now, I've managed to implement void functions.
>
> But either there's something I didn't understand, or the python prototype
> of DCOPObject.process() should be reviewed.
>
> Currently, the replyType and replyData are passed as arguments (as it is in
> C++). Their types are respectively QCString and QByteArray.
> The replyType is not a real problem, as I can set it with the setStr()
> method. However, pyKDE offers very few ways to interract with a QByteArray.
> And since it is passed as reference, I cannot build one from a python
> string.
>
> I'd like to be able to return at least a bool, an int, a QCString or a
> QCStringList. I've already tried to play with some QDataStream, etc, but
> pyKDE doesn't support the stream operators << and >>, and I couldn't obtain
> any result.
>
> Perhaps the process() method should return a tuple of (bool, [something]) ?
> I don't know if it would be perfect, though.
>
> Does anyone know how to solve this ?
It always cheers me up when someone asks about something I'm in the middle of.
I basically got a PyKDE-adapted version of pydcop (from kde-bindings - written
by Torben Weis and Julian Rockey) working this afternoon. Here's the basic
code to call a DCOP method and get the result back:
[methods from kicker/Panel are int panelSize () and
void addURLButton (QString)]
app = KApplication (...)
d = DCOPApplication ("kicker, app.dcopClient ())
ok, pSize = d.Panel.panelSize () # pSize gets the int from the call
-or-
ok = d.Panel.addURLButton (QString ("http://kde.org"))
(the QString (...) may not be required - haven't tested it yet).
That's all that's required. The dcop extension (one .py file and two global
functions added to the PyKDE kdecore lib) will take care of marshalling the
arguments (you have to provide the correct argument value types and count),
calling the function and demarshalling the replyData. The underlying methods
are available if you want to/need to do it the hard way. The kdecore
functions allow you to easily pack and unpack a QByteArray (using a
QDataStream).
No << or >> operators yet though (function calls instead) - maybe in the
future, although the interface above makes them un-needed. You need to borrow
the dcopClient instance from a KApplication (the second param in the
DCOPApplication call).
The methods above always return at least a bool ('ok' - the status value from
the DCOP call -True== success, False == Failure), and a value if the method
isn't void.
I'm in the process of figuring what types to support, but most of the common
Qt and KDE classes that DCOP uses will be supported - for the most part
supporting a type is trivial. Not sure about the template types yet (for
example, QMap). Also, docs are needed and I need to decide if some exceptions
are required or if what's already there is sufficient.
I already had the basic QByteArray/QDataStream code done, and with what PyKDE
has available plus the elegant interface the KDE guys named above wrote (and
I stole) it's a pretty slick little package. Not much code at all.
It may not be finished for the next PyKDE release, but I'll probably include
it anyway, as it's pretty usable already. I still have to look at handling
the various string types (transparently I hope) and passing in things like
lists or dicts from Python. There should be something available in a couple
of weeks.
The other things I haven't looked at yet at all are DCOP enabling apps you
write using PyKDE or handling DCOP signals, but there's code I can steal for
that too.
Jim
More information about the PyQt
mailing list