Skip to main content

KRunner in Python (I)

This is my first post, so I don't really know how to start... [DONE].

My goal is to improve the usability of the time tracking software included in KDE: KTimeTracker, just because I don't want to spend time to track it.

I'll try to expose the whole (good! It'll mean that I found a solution!) of the process I am following to get a working KDE Runner written in Python.

KDE4 (actually Plasma) brings a very useful tool called KRunner. It's a launcher that can be customized with our own actions. The plugins that implements this functionality are Runners.

So, after looking for a tutorial or example, I found the tutorials page for Plasma and, starting from the generic plasmoid tutorial, I developed a first version that looks like:

# -*- coding: utf-8 -*-
from PyKDE4.plasma import Plasma
import sys
sys.path.append('/usr/share/kde4/apps/plasma_scriptengine_python')
import plasma_importer


class PythonRunner(Plasma.RunnerScript):
    importer = None

    def __init__(self, parent):
        super(PythonRunner, self).__init__(parent)
        if PythonRunner.importer is None:
            PythonRunner.importer = plasma_importer.PlasmaImporter()
        self.initialized = False

    def init(self):
        self.m_moduleName = str(self.runner().name())
        self.plugin_name = self.m_moduleName.replace('-', '_')
        PythonRunner.importer.register_top_level(self.plugin_name,
           str(self.runner().package().path()))
        self.initialized = True
        return True

    def __dtor__(self):
        PythonRunner.importer.unregister_top_level(self.plugin_name)
        self.pyrunner = None

    def match(self, search):
        if not search.isValid():
            return
            
        term = search.query()
        if term.length < 2:
            return

        m = Plasma.QueryMatch(self)
        m.setType(Plasma.QueryMatch.ExactMatch)
        m.setText('You said "%s"' % term)
        m.setData(term)
        search.addMatch(m)

def run(self, search, action):
        print(action.data().toString())


def CreatePlugin(widget_parent, parent, component_data):
    return PythonRunner(parent)

To highlight:
  1. match(...) method receives the query from KRunner and fills the response with the found matches (if any).
  2. run(...) method receives the match that user selects in KRunner if it's one of the ours. Through the action.data() method, we reach the QVariant object stored in the match(...) method.
Everything else is explained in the tutorial, with the only exception of the install command, which should be:
plasmapkg -t runner -i hello-python.zip

Then you have to summon KRunner (usually Alt+F2) and activate the new Runner in Settings->Plugins.

Wonderful! But... it doesn't work!

To be continued...

Comments

Post a Comment

Popular posts from this blog

KRunner in Python (and IV)

To make this very simple example working, I've had to modify the pyrunner.py file that I checked out in the last post . I don't know if this changes will be necessary in newer KDE versions (mine is 4.3.4), but by now this patch can be used. And here is a final working example: from PyKDE4 import plasmascript from PyKDE4.plasma import Plasma class EchoRunner(plasmascript.Runner): def match(self, search): if not search.isValid(): return term = search.query() if term.length I think it is self explainable, but you can leave any question in the comments. You can also download the full example structure ready to install from here .

Keep It Complex and Kludgy

KICK is my brand new backronym for " keep it complex and kludgy ". It is related to Macco's razor , which holds that the weirder and more obscure answer is always the correct answer. This seems to be the main ground rule for way too many self-appointed systems architects I've met over the years. I'm about to unveil this advanced guiding principle which will boost your design skills, turning you in a real professional. The KICK principle states that you should design every system as complex as you are able to (not that you need to understand it). This way you will make sure nobody could comprehend it whatsoever . The goal of this philosophy is to become irreplaceable in the context of the project. A disciplined and tenacious work will make you an essential part of your organization ! In order to achieve this objectives, there are a number of well-known techniques at your disposal: Class explosion : follow the wise aphorism " the more, the merrier "....