如何在树莓派中通过subprocess调用Matchbox键盘实现PyQt5输入框触发展示?
树莓派PyQt5实现输入框获焦弹出系统虚拟键盘
前置准备
先安装树莓派常用的系统虚拟键盘(以matchbox-keyboard为例):
sudo apt-get install matchbox-keyboard
如果偏好其他键盘(如onboard),替换命令为sudo apt-get install onboard即可。
方法一:重写输入框焦点事件
针对单个输入控件,直接重写focusInEvent和focusOutEvent来控制键盘的启动与关闭:
import sys from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QVBoxLayout import subprocess class FocusAwareEdit(QLineEdit): def __init__(self, parent=None): super().__init__(parent) self.keyboard_proc = None def focusInEvent(self, event): super().focusInEvent(event) # 启动虚拟键盘(未启动时才执行) if not self.keyboard_proc or self.keyboard_proc.poll() is not None: self.keyboard_proc = subprocess.Popen(['matchbox-keyboard']) def focusOutEvent(self, event): super().focusOutEvent(event) # 关闭虚拟键盘(正在运行时才执行) if self.keyboard_proc and self.keyboard_proc.poll() is None: self.keyboard_proc.terminate() self.keyboard_proc.wait() class MainWindow(QWidget): def __init__(self): super().__init__() layout = QVBoxLayout() layout.addWidget(FocusAwareEdit()) layout.addWidget(FocusAwareEdit()) self.setLayout(layout) self.setWindowTitle("虚拟键盘测试") if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_())
方法二:全局事件过滤器
如果需要给所有输入控件(如QLineEdit、QTextEdit)统一处理,用Qt事件过滤器实现全局监听:
import sys from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QTextEdit, QVBoxLayout from PyQt5.QtCore import QEvent import subprocess class GlobalKeyboardHandler(QWidget): def __init__(self): super().__init__() self.keyboard_proc = None layout = QVBoxLayout() layout.addWidget(QLineEdit()) layout.addWidget(QTextEdit()) self.setLayout(layout) self.setWindowTitle("全局键盘控制") # 给应用程序安装事件过滤器 QApplication.instance().installEventFilter(self) def eventFilter(self, obj, event): # 只处理输入控件的焦点事件 if isinstance(obj, (QLineEdit, QTextEdit)): if event.type() == QEvent.FocusIn: if not self.keyboard_proc or self.keyboard_proc.poll() is not None: self.keyboard_proc = subprocess.Popen(['matchbox-keyboard']) elif event.type() == QEvent.FocusOut: if self.keyboard_proc and self.keyboard_proc.poll() is None: self.keyboard_proc.terminate() self.keyboard_proc.wait() return super().eventFilter(obj, event) if __name__ == "__main__": app = QApplication(sys.argv) window = GlobalKeyboardHandler() window.show() sys.exit(app.exec_())
注意事项
- 如果键盘进程无法正常终止,可改用
subprocess.run(['pkill', 'matchbox-keyboard'])强制结束进程 - 若使用
onboard,只需将代码中subprocess.Popen的参数替换为['onboard'] - 确保树莓派触摸屏已正确配置,系统能识别触摸输入
内容的提问来源于stack exchange,提问作者Rahul Chalke
相关产品推荐
相关产品推荐

