Почему мой прослушиватель сигналов PySide6 DBUS ScreenSaver не работает?Python

Программы на Python
Anonymous
 Почему мой прослушиватель сигналов PySide6 DBUS ScreenSaver не работает?

Сообщение Anonymous »

В настоящее время я пытаюсь подключиться к сигналу заставки (

Код: Выделить всё

org.freedesktop.ScreenSaver
- /ScreenSaver - ActiveChanged(bool)), который генерируется при закрытии экранной заставки:

Код: Выделить всё

$ dbus-monitor "interface='org.freedesktop.ScreenSaver'"
...
signal time=1761396762.341364 sender=:1.21 -> destination=(null destination) serial=94408 path=/ScreenSaver; interface=org.freedesktop.ScreenSaver; member=ActiveChanged
boolean true
...
signal time=1761396765.026613 sender=:1.21 -> destination=(null destination) serial=94464 path=/ScreenSaver; interface=org.freedesktop.ScreenSaver; member=ActiveChanged
boolean false
Последние несколько дней я бился головой о стену, пытаясь реализовать прослушиватель сигналов DBUS для этого сигнала с помощью PySide6/Qt. Это моя текущая попытка (объединяющая несколько разных попыток):

Код: Выделить всё

from __future__ import annotations

from PySide6 import QtDBus, QtCore
from PySide6.QtCore import Slot, QObject

from typing import Annotated, get_type_hints

class DBusEventDispatcher(QtCore.QObject):
def __init__(self):
super().__init__()
sessionBus = QtDBus.QDBusConnection.sessionBus()

if not sessionBus.isConnected():
errorMessage = sessionBus.lastError().message()
raise Exception("Cannot connect to DBUS: " + errorMessage)

success = sessionBus.registerService("my_app")
print(success)

success = sessionBus.registerObject(
'/',
'org.freedesktop.ScreenSaver',
self,
QtDBus.QDBusConnection.ExportAllSlots
)
print(success)

#for path in ['org.freedesktop.ScreenSaver', 'org.gnome.ScreenSaver']:
#    interface = QtDBus.QDBusInterface(path, '/ScreenSaver', '', sessionBus)
#    if interface != None:
#        interface.ActiveChanged.connect(self._onActiveChanged)

mo = self.metaObject()
for m in range(mo.methodOffset(), mo.methodCount()):
print(mo.method(m).methodSignature())

self.iface = QtDBus.QDBusInterface(
"org.freedesktop.ScreenSaver",  # Service
"/ScreenSaver",                 # Path
"org.freedesktop.ScreenSaver",  # Interface
sessionBus
)

print(self.iface.isValid())

self.iface.connect(
QtCore.SIGNAL("ActiveChanged(bool)"),
self.ActiveChanged
)

QtCore.QObject.connect(
self.iface,
QtCore.SIGNAL("ActiveChanged(bool)"),
self.ActiveChanged
)

# for service in ['org.freedesktop.ScreenSaver']: # 'org.gnome.ScreenSaver'
success = sessionBus.connect(
'org.freedesktop.ScreenSaver', # service,
'/ScreenSaver',
'org.freedesktop.ScreenSaver',
'ActiveChanged',
self,
QtCore.SLOT('ActiveChanged(bool)')
)
print(success)

@QtCore.Slot(bool)
def ActiveChanged(self, active: bool):
print("ActiveChanged")
print(active)
И я получаю положительные возвращаемые значения для разных вызовов:

Код: Выделить всё

$ python3 my_app.py
True
True
b'ActiveChanged(bool)'
True
True
Но после этого ничего...
Когда я блокирую экран, я вижу сообщение от dbus-monitor сверху, но ничего от сценария Python.
Кто-нибудь знает, что может быть не так со сценарием?
Может ли это быть системной проблемой, например, каким-то правилом systemd, блокирующим доступ?
Может быть, есть какой-нибудь флаг отладки, который я мог бы установить, чтобы видеть, что происходит внутри библиотеки Python/DBUS?
Есть еще идеи?
Спасибо за любую помощь.

Код: Выделить всё

$ python3 --version
Python 3.12.3
$ pip3 list
Package            Version
------------------ -------
cysystemd          2.0.1
pip                24.0
PySide6_Essentials 6.10.0
shiboken6          6.10.0
systemd            0.17.1
systemd-python     235
$ uname -a
Linux gerrit-framework 6.14.0-112033-tuxedo #33~24.04.1tux1 SMP PREEMPT_DYNAMIC Tue Sep 30 19:33:36 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux
$  cat /etc/issue
TUXEDO OS 24.04.3 LTS \l
< orl>KDE-Plasma-Very: 6.4.4.4.4.4.
KDE-Frameworks-Vernion: 6.17Qt-Cersion: 6.8.8.2[*]Графическая платформа: Wayland


Подробнее здесь: https://stackoverflow.com/questions/797 ... r-not-work

Вернуться в «Python»