Languages/Python/PyKDE DBus Tutorial: Difference between revisions
Added Images and cleaned up python syntax highlighting |
Added ToC, header info, cheat sheet table |
||
Line 1: | Line 1: | ||
The aim of this tutorial is to give an overview of DBus in the context of python. By the end, the goal is to understand how to find DBus methods in existing applications and how to use them in PyQt4/PyKDE4. It assumes a basic working knowledge of Python and PyKDE4. (see | {{Template:I18n/Language Navigation Bar|Development/Tutorials/Python/PyKDE_DBus_Tutorial}} | ||
{{TutorialBrowser| | |||
series=Python| | |||
name=PyKDE DBus Tutorial| | |||
next=| | |||
reading=[http://techbase.kde.org/Development/Tutorials/Python_introduction_to_signals_and_slots Qt Signals and Slots in python], [http://www.learningpython.com/2008/09/20/an-introduction-to-pyqt/ Introduction to PyQT4], [http://doc.trolltech.com/intro-to-dbus.html Qt DBus Intro] | |||
}} | |||
WORK IN PROGRESS | |||
== Abstract == | |||
The aim of this tutorial is to give an overview of DBus in the context of python. By the end, the goal is to understand how to find DBus methods in existing applications and how to use them in PyQt4/PyKDE4. It assumes a basic working knowledge of Python and PyKDE4. (see ) | |||
=== Future Plans === | |||
Later additions to this tutorial may cover creating and emitting dbus signals. | Later additions to this tutorial may cover creating and emitting dbus signals. | ||
== Introduction == | |||
=== DBus === | |||
First off, a small introduction to DBus. DBus is an inter-process communication framework. In other words, it allows different applications to talk to each other. DBus uses the concept of signals and methods, which are similar to the Signals and Slots in Qt. (For more information on Signals and Slots in python, see http://techbase.kde.org/Development/Tutorials/Python_introduction_to_signals_and_slots) You can connect signals to methods, or call methods directly. | First off, a small introduction to DBus. DBus is an inter-process communication framework. In other words, it allows different applications to talk to each other. DBus uses the concept of signals and methods, which are similar to the Signals and Slots in Qt. (For more information on Signals and Slots in python, see http://techbase.kde.org/Development/Tutorials/Python_introduction_to_signals_and_slots) You can connect signals to methods, or call methods directly. | ||
=== Bus Types === | |||
Everything sent or received in dbus is transferred over a bus. There are two main buses available, the Session Bus and the System Bus. The former handles per-session (per-user) information while the System Bus handles systemwide notification and settings. For example, the hal subsystem provides a number of interfaces on the System Bus, while Amarok or PowerDevil provides session-specific interfaces for control over music and power options, respectively. | Everything sent or received in dbus is transferred over a bus. There are two main buses available, the Session Bus and the System Bus. The former handles per-session (per-user) information while the System Bus handles systemwide notification and settings. For example, the hal subsystem provides a number of interfaces on the System Bus, while Amarok or PowerDevil provides session-specific interfaces for control over music and power options, respectively. | ||
=== Interfaces === | |||
A DBus path is made up of three parts, the Service Name, the Object Path and the Interface. The following table (taken from the Qt intro to dbus) provides some ways to distinguish between the three parts. | A DBus path is made up of three parts, the Service Name, the Object Path and the Interface. The following table (taken from the Qt intro to dbus) provides some ways to distinguish between the three parts. | ||
=== DBus Cheat Sheet === | |||
D-Bus Concept | |||
Analogy Name format | {| | ||
Service name | |- | ||
! D-Bus Concept !! Analogy !! Name format | |||
|- | |||
| Service name || Network hostnames || Dot-separated ("looks like a hostname") | |||
|- | |||
| Object path || URL path component || Slash-separated ("looks like a path") | |||
|- | |||
| Interface || Plugin identifier || Dot-separated | |||
|} | |||
== Exploring DBus Interfaces == | |||
One of the easiest ways to discover a DBus method is by browsing for it using qdbusviewer. Run this program from your command line or KRunner (alt+f2) prompt. | One of the easiest ways to discover a DBus method is by browsing for it using qdbusviewer. Run this program from your command line or KRunner (alt+f2) prompt. | ||
=== QDBusViewer === | |||
You should see the following screen: | You should see the following screen: | ||
Line 24: | Line 59: | ||
The two tabs available are the Session Bus and the System Bus. | The two tabs available are the Session Bus and the System Bus. | ||
=== Services === | |||
Within each bus, the left pane shows Service Names. If you click on a service, the right pane shows information about that service. | Within each bus, the left pane shows Service Names. If you click on a service, the right pane shows information about that service. | ||
Line 29: | Line 66: | ||
Find the org.freedesktop.PowerManagement service and select it. You show now see the following: | Find the org.freedesktop.PowerManagement service and select it. You show now see the following: | ||
[[Image:QDBusViewer-PowerManagement.png|400px|thumb|left|org.freedesktop.PowerManagement screen]] | [[Image:QDBusViewer-PowerManagement.png|400px|thumb|left|org.freedesktop.PowerManagement screen]] | ||
=== Object Paths === | |||
Everything you see on the right pane is the start of an Object Path. Try expanding down the modules/powerdevil/ path. You should now see the following: | Everything you see on the right pane is the start of an Object Path. Try expanding down the modules/powerdevil/ path. You should now see the following: | ||
[[Image:QDBusViewer-powerdevilpath.png|400px|thumb|left|modules/powerdevil/ path screen]] | [[Image:QDBusViewer-powerdevilpath.png|400px|thumb|left|modules/powerdevil/ path screen]] | ||
=== Interfaces === | |||
org.kde.PowerDevil | org.kde.PowerDevil | ||
Line 39: | Line 80: | ||
The above entries are Interfaces. They are the things that you can actually interact with. When you expand the org.kde.PowerDevil interface, you see a number of Methods and Signals: | The above entries are Interfaces. They are the things that you can actually interact with. When you expand the org.kde.PowerDevil interface, you see a number of Methods and Signals: | ||
[[Image:QDBusViewer-powerdevilPath-expanded.png|400px|thumb|left|powerdevil expanded screen]] | [[Image:QDBusViewer-powerdevilPath-expanded.png|400px|thumb|left|powerdevil expanded screen]] | ||
=== Calling Methods === | |||
Clicking on a Method will call it. Try clicking on the "turnOffScreen" method. Your screen should go blank. Note: You can get your display back by wiggling your mouse. | Clicking on a Method will call it. Try clicking on the "turnOffScreen" method. Your screen should go blank. Note: You can get your display back by wiggling your mouse. | ||
Line 48: | Line 91: | ||
== PyKDE4 == | |||
Now, for working with methods in python and PyKDE4. | Now, for working with methods in python and PyKDE4. | ||
=== Code Example === | |||
<code python> | <code python> | ||
Line 114: | Line 159: | ||
app.exec_ () | app.exec_ () | ||
</code> | </code> | ||
Revision as of 18:58, 1 April 2009
Development/Tutorials/Python/PyKDE_DBus_Tutorial
Languages: عربي | Asturianu | Català | Česky | Kaszëbsczi | Dansk | Deutsch | English | Esperanto | Español | Eesti | فارسی | Suomi | Français | Galego | Italiano | 日本語 | 한국어 | Norwegian | Polski | Português Brasileiro | Română | Русский | Svenska | Slovenčina | Slovenščina | српски | Türkçe | Tiếng Việt | Українська | 简体中文 | 繁體中文
Tutorial Series | Python |
Previous | None |
What's Next | |
Further Reading | Qt Signals and Slots in python, Introduction to PyQT4, Qt DBus Intro |
WORK IN PROGRESS
Abstract
The aim of this tutorial is to give an overview of DBus in the context of python. By the end, the goal is to understand how to find DBus methods in existing applications and how to use them in PyQt4/PyKDE4. It assumes a basic working knowledge of Python and PyKDE4. (see )
Future Plans
Later additions to this tutorial may cover creating and emitting dbus signals.
Introduction
DBus
First off, a small introduction to DBus. DBus is an inter-process communication framework. In other words, it allows different applications to talk to each other. DBus uses the concept of signals and methods, which are similar to the Signals and Slots in Qt. (For more information on Signals and Slots in python, see http://techbase.kde.org/Development/Tutorials/Python_introduction_to_signals_and_slots) You can connect signals to methods, or call methods directly.
Bus Types
Everything sent or received in dbus is transferred over a bus. There are two main buses available, the Session Bus and the System Bus. The former handles per-session (per-user) information while the System Bus handles systemwide notification and settings. For example, the hal subsystem provides a number of interfaces on the System Bus, while Amarok or PowerDevil provides session-specific interfaces for control over music and power options, respectively.
Interfaces
A DBus path is made up of three parts, the Service Name, the Object Path and the Interface. The following table (taken from the Qt intro to dbus) provides some ways to distinguish between the three parts.
DBus Cheat Sheet
D-Bus Concept | Analogy | Name format |
---|---|---|
Service name | Network hostnames | Dot-separated ("looks like a hostname") |
Object path | URL path component | Slash-separated ("looks like a path") |
Interface | Plugin identifier | Dot-separated |
Exploring DBus Interfaces
One of the easiest ways to discover a DBus method is by browsing for it using qdbusviewer. Run this program from your command line or KRunner (alt+f2) prompt.
QDBusViewer
You should see the following screen:
The two tabs available are the Session Bus and the System Bus.
Services
Within each bus, the left pane shows Service Names. If you click on a service, the right pane shows information about that service.
Find the org.freedesktop.PowerManagement service and select it. You show now see the following:
Object Paths
Everything you see on the right pane is the start of an Object Path. Try expanding down the modules/powerdevil/ path. You should now see the following:
Interfaces
org.kde.PowerDevil org.freedesktop.DBus.Properties org.freedesktop.DBus.Introspectable
The above entries are Interfaces. They are the things that you can actually interact with. When you expand the org.kde.PowerDevil interface, you see a number of Methods and Signals:
Calling Methods
Clicking on a Method will call it. Try clicking on the "turnOffScreen" method. Your screen should go blank. Note: You can get your display back by wiggling your mouse.
When your display comes back, you should see some information in the bottom pane.
Since the method returned nothing, qdbusviewer told us that.
PyKDE4
Now, for working with methods in python and PyKDE4.
Code Example
- ! /usr/bin/python
- -*- coding: utf-8 -*-
import sys
from PyKDE4.kdecore import ki18n, KAboutData, KCmdLineArgs
from PyKDE4.kdeui import KApplication
from PyQt4.QtGui import QLabel, QWidget, QPushButton, QBoxLayout
from PyQt4.QtCore import Qt, QObject, SIGNAL
import dbus
class MainWindow (QWidget):
def __init__ (self):
QWidget.__init__ (self)
self.sessionBus = dbus.SessionBus()
self.powerdevil = self.sessionBus.get_object('org.freedesktop.PowerManagement',
'/modules/powerdevil')
self.layout = QBoxLayout(QBoxLayout.TopToBottom, self)
self.setLayout(self.layout)
label = QLabel ("This is a simple PyKDE4 program", self)
self.layout.addWidget(label)
button = QPushButton("Push to turn off screen!", self)
self.layout.addWidget(button)
QObject.connect(button, SIGNAL("clicked()"), self.screenOff)
self.resize (640, 480)
def screenOff(self):
self.powerdevil.turnOffScreen(dbus_interface='org.kde.PowerDevil')
- --------------- main ------------------
if __name__ == '__main__':
appName = "DBusApp"
catalog = ""
programName = ki18n ("DBus Example Application")
version = "1.0"
description = ki18n ("DBus Example")
license = KAboutData.License_GPL
copyright = ki18n ("(c) 2009 Andrew Stromme")
text = ki18n ("none")
homePage = "http://blog.chatonka.com"
bugEmail = "[email protected]"
aboutData = KAboutData (appName, catalog, programName, version, description,
license, copyright, text, homePage, bugEmail)
KCmdLineArgs.init (sys.argv, aboutData)
app = KApplication ()
mainWindow = MainWindow ()
mainWindow.show ()
app.exec_ ()