У меня есть приложение с графическим интерфейсом (сделанное с PyQt5 и QML), и я хочу получать уведомления, когда USB-устройство подключено или отключено от компьютера.После некоторого расследования я обнаружил, что pyudev может быть библиотекой для использования.Но у меня проблемы с использованием его с PyQt5 и QML.Мне удалось использовать пример pyudev для MonitorObservor , и есть другой пример, приведенный в документации, здесь с PySide и здесь с Glib .Я также нашел пример использования PyQt5 и приложения виджетов здесь .Но у меня возникли проблемы с реализацией этого в моем приложении PyQt5 QML.Я уверен, что это очень легко, поэтому я думаю, что просто что-то упустил, но я не могу выяснить, что ...
Вот что у меня есть:
import sys
from PyQt5.QtWidgets import QApplication
from PyQt5.QtQml import QQmlApplicationEngine
from PyQt5.QtCore import QUrl
from pyudev import Context, Monitor, Device
from pyudev.pyqt5 import MonitorObserver
from Passerelle import *
# def device_connected(self, device):
def device_connected(self):
print("Test")
print("device action: ", device.action, ", path: ", device.device_path)
if __name__ == "__main__":
app = QApplication(sys.argv)
engine = QQmlApplicationEngine()
p = Passerelle()
engine.rootContext().setContextProperty("passerelle", p)
engine.load(QUrl("main.qml"))
if not engine.rootObjects:
sys.exit(-1)
context = Context()
monitor = Monitor.from_netlink(context)
# monitor.filter_by(subsystem='tty')
observer = MonitorObserver(monitor)
observer.deviceEvent.connect(device_connected)
monitor.start()
ret = app.exec_()
sys.exit(ret)
Мне удалось вывести «Test» на консоли при отключении или повторном подключении устройства, но я не могу напечатать информацию об устройстве (TypeError: device_connected() missing 1 required positional argument: 'device'
, когда я раскомментирую def device_connected(self, device):
).
Здесь первыйшаг должен был бы иметь возможность напечатать информацию об устройстве на консоли, затем найти способ уведомить GUI и, наконец, уведомить GUI, только если устройство, подключенное или отключенное, имеет указанный VID / PID.
Редактировать: я нашел способ идентифицировать устройство с помощью VID PID, используя vid = device.get('ID_VENDOR_ID')
и pid = device.get('ID_MODEL_ID')
На втором этапе я подумал об использовании класса Passerelle в качестве QMLbackend:
from PyQt5.QtCore import QObject, pyqtSlot, pyqtSignal#, pyqtProperty, QUrl
from pyudev import Context, Monitor
from pyudev.pyqt5 import MonitorObserver
def device_event(observer, device):
print ("event ", device.action, " on device ", device)
class Passerelle(QObject):
sendDeviceEvent = pyqtSignal(int)
def __init__(self, parent=None):
print("Passerelle constructor called")
QObject.__init__(self, parent)
print("end Passerelle constructor")
@pyqtSlot()
def setObserverForDeviceEvents(self):
print("setObserverForDeviceEvents called")
context = Context()
monitor = Monitor.from_netlink(context)
monitor.filter_by(subsystem='usb')
observer = MonitorObserver(monitor)
observer.deviceEvent.connect(self.device_connected)
monitor.start()
print("end setObserverForDeviceEvents")
def device_connected(self, device):
print("Test")
print("device action: ", device.action, ", path: ", device.device_path)
Но я не уверен, что это хорошая идея, поскольку я прочитал в этом post , что монитор должен быть запущен перед входом в основной цикл qt.Под этим я понимаю: монитор должен быть запущен в main.py перед вызовом app.exec _ () ...
Заранее благодарен за помощь!