Использование pyudev.pyqt5 в цикле событий PyQt5

Я хотел написать небольшое приложение, которое будет отображать имя USB-устройства в небольшом текстовом браузере, когда оно будет вставлено. Я использую Pyudev, чтобы сделать это. Вместо того, чтобы использовать собственный цикл событий pyudev, я обнаружил, что мы можем интегрировать pyudev в цикл событий qt, используя MonitorObserver. Я пытался сделать это, но результаты бесплодны. Вот код, который я пробовал до сих пор. Пожалуйста, скажите мне, если я делаю ошибку.

импорт

from PyQt5.QtCore import pyqtSignal,pyqtSlot,QObject,QSocketNotifier
from PyQt5.QtWidgets import QWidget,QApplication
from form_designer import Ui_Form
from pyudev.pyqt5 import MonitorObserver
from pyudev import Context,Monitor
from PyQt5 import QtCore

Малый класс

class mainWindow(QWidget,Ui_Form):
    def __init__(self,monitor):
        super().__init__()

        self.setupUi(self)
        print("First test")

        monitor.filter_by(subsystem='tty')
        self.observer = MonitorObserver(monitor)
        print("second test")

        self.observer.deviceEvent.connect(self.device_connected)
    @pyqtSlot()
    def device_connected(self,device):
        self.textBrowser.append(device.sys_name)
        print("Test")

Я даже протестировал использование отпечатков, чтобы увидеть, как далеко заходит петля. Вот инициализация и основной

def main():
    import sys
    app = QApplication(sys.argv)
    context = Context()
    monitor = Monitor.from_netlink(context)
    window = mainWindow(monitor)
    window.show()

    app.exec_()
    monitor.start()
if __name__ == '__main__':
    main()

При выполнении он печатает первые два отпечатка, и слот никогда не вызывается.

К вашему сведению: прошла неделя с тех пор, как я начал изучать питон.

1 ответ

Решение

Вам нужно запустить монитор перед запуском цикла обработки событий. Кроме того, избегайте использования @pyqtSlot Декоратор - он редко нужен, и очень легко ошибиться в определении, если вы не знаете, что делаете (как вы это делали в своем примере).

Итак, ваш код должен выглядеть так:

class mainWindow(QWidget, Ui_Form):
    def __init__(self):
        ...
        context = Context()
        monitor = Monitor.from_netlink(context)
        monitor.filter_by(subsystem='tty')
        self.observer = MonitorObserver(monitor)
        self.observer.deviceEvent.connect(self.device_connected)
        monitor.start()

    def device_connected(self, device):
        self.textBrowser.append(device.sys_name)
        print("Test")

def main():
    import sys
    app = QApplication(sys.argv)
    window = mainWindow()
    window.show()
    app.exec_()

PS: было бы неплохо закомментировать filter_by подключите USB-устройство, чтобы убедиться, что все работает нормально.

Другие вопросы по тегам