在 Linux 上的 Python 中需要将键盘焦点保持在 OpenCV 窗口上

问题描述 投票:0回答:1

我在 Python 代码中打开多个窗口,并且需要 OpenCV 窗口来保持键盘焦点。我可以在 Windows 操作系统上执行此操作,并且我认为 OS-X 会自动执行此操作,因为其他窗口无法接受按键,但我需要 Linux 上的帮助。我相信我在代码中注释了正确的语句以保持窗口处于活动状态,但我需要从 OpenCV 窗口名称“cv2window”获取窗口句柄 (

QWidget.window()
)。下面是一个示例代码,如果
window_focus("cv2window")
未注释掉,该代码将保持焦点。我只需要完成 Linux 版本的工作即可。

    import sys
    import cv2
    import numpy as np
    import matplotlib as mpl
    import PyQt6 as qt  # Must be before import of matplotlibl.pyplot
    mpl.use('qtagg')    # Use the QT backend
    import matplotlib.pyplot as plt
    
    if sys.platform == "win32":
        import warnings
        warnings.simplefilter("ignore", UserWarning )  # Fix Windows warning
        sys.coinit_flags = 2
        from pywinauto.findwindows import find_window    # Windows OS window focus
        import win32gui
    #elif sys.platform == "darwin":
        #import AppKit    # pip install pyobjc       Mac OS window focus
    elif "linux" in sys.platform:
        print( "Linux support in development" )
    
    def window_focus( window_name ):
        if sys.platform == "win32":
            win32gui.SetForegroundWindow(find_window(title=window_name))
        #elif sys.platform == "darwin":    # OSX doesn't seem to need this to maintain focus
            #cv2.setWindowProperty(window_name, cv2.WND_PROP_TOPMOST, 1)
            #AppKit.NSApplication.sharedApplication().activateIgnoringOtherApps_(1)
        elif "linux" in sys.platform:
            print( "Linux support in development" )
            #qt.QtWidgets.QMainWindow.setWindowState( 0, qt.QtCore.Qt.WindowActive )
            # Error says first arg must be QWidget type so still need window handle
    
    img = cv2.imread( "python_colors.png" )
    t = np.arange( 0.0, 2.0, 0.01 )
    s = np.sin( 2 * np.pi * t )
    fig = plt.figure( "MatPlotLibWindow" )
    plt.plot( t, s )
    plt.ion()
    plt.show()
    
    while True:
    
        cv2.imshow( "cv2window", img )
    
        plt.plot( t, s )
        plt.show()
    
        window_focus( "cv2window" )
    
        while True:
            k = cv2.waitKey(0)
            if k != -1:    # Wait for any key press
                break
        if k == ord('x'):
            break

这适用于 OS-X 和 Windows,但不适用于 Linux。

linux qt opencv user-interface pyqt
1个回答
0
投票

所以我认为您可以通过使用

pynput
模块或任何其他可以让您获得键盘按键的模块来获得以键盘为中心的输入。您正在寻找的术语是“热键”。据我所知,即使窗口位于背景或未突出显示,热键也可以工作。如果我分配一个热键,即使您不在该窗口上,它基本上也会响应按键。

© www.soinside.com 2019 - 2024. All rights reserved.