[PyKDE] Panel applets with PyKDE/Python
Jim Bublitz
jbublitz at nwinternet.com
Tue Aug 19 03:11:01 BST 2003
On Monday August 18 2003 16:06, Roland Schulz wrote:
> do you think the same would work for Custom Widgets in
> QtDesigner?
I just looked at Qt Designer quickly and I'm not real familiar
with it. I think what you're asking is "Would it be possible to
create a custom widget in Python and have Qt Designer handle it
properly?" , or am I missing the point?
Assuming that's what you're asking, the code would be different -
this is very panel applet specific - but the basic approach
should be the same. I'm also assuming that the "plugin.h" stuff
in the custom widget section of the Qt Designer manual is
methods that Qt Desinger calls that reside in the custom widget.
If that's also correct, then my guess is you'd have to do the
same thing that PyKDE would do for panel applets, but once for
each method.
For panel applets, kicker finds a .desktop file in its directory
and from there gets the name of the panel applet .so lib to
load. PyKDE will substitute a single .so that loads any Python
panel applet (so it needs a mod to KDE/kicker to pass in the
name of the script being requested - this is really easy to do).
Here's the part that I think is similar to Qt Designer: when
kicker loads the lib for the applet, it looks for a function:
KPanelApplet *init (QWidget *parent, QString& configFile);
(PyKDE's .so lib wants to see a script name in configFile, which
doesn't happen right now).
A C++ applet's init would construct a KPanelApplet subclass that
does whatever the applet's supposed to do and return a pointer
to the subclass to kicker. Instead of that, PyKDE's init:
1. Loads the Python interpreter (from another linked .so lib)
2. Converts the QWidget and QString to PyObjects (using sip
conversion functions from PyQt)
3. Loads the Python script into the interpreter
4. Calls a Python version of "init" in the script loaded (passes
the args that kicker sent to init)., which then uses Python to
construct the applet and returns a PyObject to the C++ init
5. Converts (using sip again and PyKDE) the PyObject returned to
a C++ KPanelApplet * and returns it to kicker.
It's taken more lines to describe it than to code it. Basically,
you'd need to do the same thing with Qt Designer for each method
(again if I understand it correctly after a quick look).
Somebody who understands Qt plugins might have a better
explanation.
In fewer words, you need to provide a wrapper for the entire
interface, and embed Python into it.
The two hard parts are:
1. Converting objects between C++ and Python domains -
sip/PyQt/PyKDE make this easy.
2. Loading and comminicating with the Python interpreter - I
built a lib that makes this easy too.
The problem with releasing this that the panel applet part is
easier if tightly integrated into PyKDE, but I don't want to do
that until KDE/kicker supports it. It's a lot of picky details
to get this to build and link automatically (and that's true
whether it's part of PyKDE or not). The python lib part is
pretty stand-alone (it's independent of sip/PyKDE) - it's in
C++, it has a complete set of unit tests (yay!) and I threw
together a C wrapper (with it's own set of tests) in about 15
minutes while waiting for FedEx to call for my pickup. If
someone wants to see that, I can throw together some docs and
tar it up. The only thing I don't know is if it's thread safe (I
know NOTHING about threads).
Jim
> Am Montag, 18. August 2003 07:26 schrieb Jim Bublitz:
> > I've been promising to do something with this for quite a
> > while and finally got to it.
> > I spent some time this weekend playing around with the
> > possibility of writing panel applets for KDE (kicker) in
> > Python using PyKDE. David Boddie has made some preliminary
> > code available which I stole from shamelessly and with
> > mostly a little reorganization got it somewhat working.
More information about the PyQt
mailing list