Использование 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-устройство, чтобы убедиться, что все работает нормально.