0

ライブラリhttps://github.com/jaseg/python-mpvを使用して mpv プレーヤーを制御していますが、pyside6 と組み合わせて使用​​すると、キーバインドが機能しません (プレーヤーが入力を完全に受け入れません)。私は何を間違っていますか?またはpyside6に埋め込むときにそれらを使用することは不可能ですか? (埋め込みなしで同じ引数でプレーヤーを実行すると、すべて正常に動作します)

import os
os.add_dll_directory(os.getcwd())
import mpv
from PySide6.QtWidgets import *
from PySide6.QtCore import *
mpvfolderpath = f"mpv.net/portable_config/"
import sys
class Test(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.container = QWidget(self)
        self.setCentralWidget(self.container)
        self.container.setAttribute(Qt.WA_DontCreateNativeAncestors)
        self.container.setAttribute(Qt.WA_NativeWindow)
        player = mpv.MPV(wid=str(int(self.container.winId())),
                         vo="gpu",  # You may not need this
                         log_handler=print,
                         loglevel='debug',
                         input_default_bindings=True,
                         input_vo_keyboard=True)

        @player.on_key_press('f')
        def my_f_binding():
            print("f работает!")
        player.play('test.mp4')

app = QApplication(sys.argv)

# This is necessary since PyQT stomps over the locale settings needed by libmpv.
# This needs to happen after importing PyQT before creating the first mpv.MPV instance.
import locale
locale.setlocale(locale.LC_NUMERIC, 'C')
win = Test()
win.show()
sys.exit(app.exec_())
4

1 に答える 1

0

キーボードが処理されない場合 (私のテストでは、マウスがビデオをホバリングしていないときにのみ発生しました)、キー イベントが Qt ウィンドウに伝達されます。これは、これらのイベントをkeyPressEvent()オーバーライドで処理し、関数に既にマップされている適切な mpv コマンドを作成できることを意味しkeypress()ます。明らかに、プレーヤーへの参照が存在する必要があるため、それをインスタンス アトリビュートにする必要があります。

標準のリテラル キーの場合、通常はイベントの を使用するだけで十分ですが、矢印などの他のキーの場合は、イベントを mpv のキー名text()でマッピングする必要があります。辞書を使用する方が確かに簡単です。

MpvKeys = {
    Qt.Key.Key_Backspace:   'BS', 
    Qt.Key.Key_PageUp:      'PGUP', 
    Qt.Key.Key_PageDown:    'PGDWN', 
    Qt.Key.Key_Home:        'HOME', 
    Qt.Key.Key_End:         'END', 
    Qt.Key.Key_Left:        'LEFT', 
    Qt.Key.Key_Up:          'UP', 
    Qt.Key.Key_Right:       'RIGHT', 
    Qt.Key.Key_Down:        'DOWN', 
    # ...
}

class Test(QMainWindow):
    def __init__(self, parent=None):
        # ...
        self.player = mpv.MPV(...)

    def keyPressEvent(self, event):
        # look up for the key in our mapping, otherwise use the event's text
        key = MpvKeys.get(event.key(), event.text())
        self.player.keypress(key)

注: 私のテストでは、vo='x11'ウィンドウを適切に埋め込むためにフラグを使用osc=Trueする必要があり、ネイティブ OSD を使用する必要もありました。

于 2022-02-23T18:13:44.013 に答える