PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : pyKDE/pyQt: extending the mainloop?



panzi
21-04-2006, 13:36
Hi.

Ich hab ein kleines pyKDE script welches DCOP calls sendet. Das script selbst hat kein MainWindow (nur ein paar Dialoge). "Nachrichten" bekommt das script über stdin. Zeilenweise. Ist ein amaroK plugin.

Also lege ich eine KApplication an, aber nur um deren dcopClient zu verwenden. Das hat zur Folge das kdcop einfriert. Warum? Na weil mein script niemals die Qt-Mainloop betritt. Es sendet nur DCOP-calls. Empfangen tut's nur Daten von stdin. Also meine "mainloop" ist ein lesen von stdin bis EOF (bzw. SIGTERM). Und da die Qt-Mainloop nicht läuft, gibts keine Antwort auf eine DCOP-Interfaceabfrage -> kdcop hängt.

Jetzt würde ich gerne wissen, wie ich das "Nachrichten zeilenweise von stdin lesen" in die Qt-Mainloop einbaun kann. Gibt's da ne möglichkeit?

DANKE,
panzi

panzi
21-04-2006, 14:31
Hab nen anderen weg gefunden. Da ich ja nur DCOP calls mache, aber keine empfange, rufe ich einfach das auf, bevor ich eine KApplication anlege:

KApplication.disableAutoDcopRegistration()
Damit ist mein kapp.dcopClient() dann nicht registriert. D.h. er wird auch nie kontaktiert. Nur muss ich auch noch das machen:


client = kapp.dcopClient()
client.attach()

anda_skoa
21-04-2006, 14:34
Vermutlich kann man auch nur einen DCOPClient erzeugen und braucht gar keine KApplication

Aber wenns eh schon geht :)

Ciao,
_

panzi
21-04-2006, 19:11
Vermutlich kann man auch nur einen DCOPClient erzeugen und braucht gar keine KApplication

Aber wenns eh schon geht :)

Ciao,
_
Ja, kann man. Aber ich brauch eine KApplication damit ein KMessageBox.information()-Aufruf u.ä. funktioniert. Nur wenn es ein KApplication-Objekt gibt, kann ich irgeneinen KDE-Dialog anzeigen (kA warum).

panzi@a2000p:~$ python
Python 2.4.2 (#2, Sep 30 2005, 21:19:01)
[GCC 4.0.2 20050808 (prerelease) (Ubuntu 4.0.1-4ubuntu8)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from kdeui import *
>>> KMessageBox.information(None,'foo')
QPaintDevice: Must construct a QApplication before a QPaintDevice
Abgebrochen
panzi@a2000p:~$

anda_skoa
22-04-2006, 20:19
Du brauchst für GUI zumindest eine QApplication Instanz, für einige KDE Klasse manchmal auch eine KInstance Instanz. (KApplication ist eine Subklasse von beiden)

Ciao,
_