3

挿入された USB デバイスの名前を小さなテキスト ブラウザに表示する小さなアプリケーションを作成したいと考えていました。私はそれを行うためにpyudevを使用しています。pyudev 独自のイベント ループを使用する代わりに、MonitorObserver を使用して pyudev を qt のイベント ループに統合できることがわかりました。私はそれをやろうとしてきましたが、結果は実りのないものです。これまでに試したコードは次のとおりです。私が間違っているかどうか教えてください。

輸入品

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()

実行すると、最初の 2 つのプリントが出力され、スロットが呼び出されることはありません。

参考までに: Python の学習を開始してから 1 週間が経ちました。

4

1 に答える 1

4

イベントループを開始する前に、モニターを開始する必要があります。また、@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_byUSB デバイスを接続することをお勧めします。

于 2016-11-26T02:00:53.233 に答える