Difference between revisions of "Development/Tutorials/Plasma/Python/Using widgets"

Jump to: navigation, search
(The 'main.py' file: never "use from x import *"!)
m (Text replace - "<code python>" to "<syntaxhighlight lang="python">")
Line 11: Line 11:
 
Here is how our main.py file will look like:
 
Here is how our main.py file will look like:
  
<code python>
+
<syntaxhighlight lang="python">
 
# -*- coding: utf-8 -*-
 
# -*- coding: utf-8 -*-
 
# Copyright stuff
 
# Copyright stuff

Revision as of 21:34, 29 June 2011

Abstract

Using the paintInterface() method to display applets is a powerful, and sometimes even necessary way of working. For example, when you want to display a SVG graphic. But it is not the only method available to create a Plasmoid, however. Plasma comes with a number of widgets "tailored" for use in Plasmoids. In this tutorial we will create a very simple "Hello, world!" Plasmoid using Plasma widgets.

Prerequisites

Set up your applet directory and create a metadata.desktop file as described in the Getting Started tutorial.

The 'main.py' file

Here is how our main.py file will look like:

# -*- coding: utf-8 -*-
# Copyright stuff
from PyQt4.QtCore import Qt
from PyQt4.QtGui import QGraphicsLinearLayout
from PyKDE4.plasma import Plasma
from PyKDE4 import plasmascript
 
class HelloWorldApplet(plasmascript.Applet):
    def __init__(self,parent,args=None):
        plasmascript.Applet.__init__(self,parent)
 
    def init(self):
        self.setHasConfigurationInterface(False)
        self.setAspectRatioMode(Plasma.Square)
 
        self.theme = Plasma.Svg(self)
        self.theme.setImagePath("widgets/background")
        self.setBackgroundHints(Plasma.Applet.DefaultBackground)
 
        self.layout = QGraphicsLinearLayout(Qt.Horizontal, self.applet)
        label = Plasma.Label(self.applet)
        label.setText("Hello world!")
        self.layout.addItem(label)
        self.applet.setLayout(self.layout)
        self.resize(125,125)
 
def CreateApplet(parent):
    return HelloWorldApplet(parent)
 
</code>
 
Let's take a deeper look at it. As in the main tutorial, we create our class by deriving from the <tt>plasmascript.Applet</tt> class. In <tt>__init__()</tt>, we quickly initialize the class. We use the <tt>init()</tt> method instead to do all the dirty work of creating the applet and adding the widget needed to display the text.
 
First of all we tell Plasma that this applet does not have a configuration dialog (<tt>self.setHasConfigurationInterface(False)</tt>). We then set the aspect ratio mode to a square (<tt>Plasma.Square</tt>). This is taken into account when someone resizes the applet. Next, we add a background to the applet using a SVG image provided by the standard Plasma theme. We do so by creating an instance of <tt>Plasma.Svg</tt>, assigning it to <tt>self.theme</tt>, and then specifying the SVG graphic we want to use via <tt>self.setImagePath()</tt>. This way the applet will use the standard "background" SVG provided by the "widgets" directory of our current Plasma theme. We can also use relative paths or absolute paths to SVGs of our choice, should we need to. The <tt>setBackgroundHints()</tt> method sets the Plasmoid's background to the default Plasma background (<tt>Plasma.Applet.DefaultBackground</tt>) saving us from having to manually draw the background ourselves.
 
The third and most important step deals with creating a layout. It is a bit different than the standard <tt>QBoxLayout</tt> seen in Qt and PyQt, because it is done inside a <tt>QGraphicsView</tt> used by Plasma. We want a simple, linear layout, and so we use a <tt>QGraphicsLinearLayout</tt>, setting it to be horizontal (<tt>Qt.Horizontal</tt>).
 
Next we create a <tt>Plasma.Label</tt>. This is a widget that is Plasma aware and therefore uses all of the goodies provided by Plasma. For example, automatically changing its text color if the Plasma theme changes. We then use the <tt>setText()</tt> method (analogous to the normal <tt>QLabel.setText()</tt> method) to set our label text ("Hello, world!") and then add the label to the layout. Also, we set the applet's layout to be the one we have just defined using <tt>self.applet.setLayout</tt>. Finally we resize the applet to 125 x 125 pixels. When using <tt>self.applet.setLayout(self.layout)</tt> it is really not necessary to resize the applet because the layout will make sure that the applet has a reasonable size.
 
Once packaged and installed (see [[../GettingStarted | the Getting Started tutorial]]), the Plasmoid will look like this:
 
[[Image:Helloworld.png|center]]
 
== Conclusion ==
 
This brief tutorial shows how to use Plasma widgets with your applet. Beside <tt>Plasma.Label</tt> there are many more widgets that you can use. The [http://api.kde.org/4.x-api/kdelibs-apidocs/plasma/html/annotated.html C++ widget definitions] should be used till a python API is put up.
 
Notice that at the moment you can only add widgets and create layouts directly in code. This means you can't use an application like Qt Designer to design the appearance of your applet.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V.Legal