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