gpt4 book ai didi

python - 用 python 在 Raspbian 中模拟击键

转载 作者:行者123 更新时间:2023-11-28 18:24:09 25 4
gpt4 key购买 nike

我偶然发现了 this question当试图找出如何让 python 脚本在按下按钮后发送向左或向右击键时(利用 GPIO 引脚)。

似乎为链接问题选择的答案是我需要的,但是在安装 xautomation 之后,尝试使代码适应我的脚本并阅读 Popen 的文档(我什至尝试运行一个新文件与代码逐字)我不断收到以下错误:

Traceback (most recent call last):
File "/home/zdistaging/Documents/xte test.py", line 17, in <module>
keypress(shift_a_sequence)
File "/home/zdistaging/Documents/xte test.py", line 15, in keypress
p.communicate(input=sequence)
File "/usr/lib/python3.4/subprocess.py", line 941, in communicate
self.stdin.write(input)
TypeError: 'str' does not support the buffer interface

我在 Pi 3 模型 B 上运行 Python3,在带有 Pixel 的 Raspbian Jessie 中(从 raspberrypi.org 下载)

知道为什么会出错吗?

如果它有帮助的话,我想做的就是允许用户在 FEH 幻灯片中左右滚动……我可能完全不理解这种方法,因为这是一项看似简单的任务.我不是在找人为我彻底解决这个问题——我喜欢与编码相关的挑战——我只是 python 的新手;将我推向正确的方向会非常有帮助。

非常感谢任何帮助!!!

编辑:很抱歉没有包含代码!

from subprocess import Popen, PIPE

control_f4_sequence = '''keydown Control_L
key F4
keyup Control_L
'''

shift_a_sequence = '''keydown Shift_L
key A
keyup Shift_L
'''

def keypress(sequence):
p = Popen(['xte'], stdin=PIPE)
p.communicate(input=sequence)

keypress(shift_a_sequence)
keypress(control_f4_sequence)

编辑编辑:

这是我更新后的代码...它实际上为按下左右按钮打印空格。

import time
import RPi.GPIO as GPIO
from subprocess import Popen, PIPE
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

leftArrow = '''key \x1B[D''' # I've tried '''key Left'''
rightArrow = '''key \x1B[C''' # and '''key Right''' with the same results

offButton = 26 # Black wire
onButton = 19 # White wire
leftButton = 13 # Red wire
rightButton = 6 # Green wire


def keypress(sequence):
if isinstance(sequence, str):
sequence = sequence.encode('ascii')
p = Popen(['xte'], stdin=PIPE)
p.communicate(input=sequence)


GPIO.setup( offButton, GPIO.IN, GPIO.PUD_UP )
GPIO.setup( onButton, GPIO.IN, GPIO.PUD_UP )
GPIO.setup( leftButton, GPIO.IN, GPIO.PUD_UP )
GPIO.setup( rightButton, GPIO.IN, GPIO.PUD_UP )


while True:
offButton_state = GPIO.input( offButton )
onButton_state = GPIO.input( onButton )
leftButton_state = GPIO.input( leftButton )
rightButton_state = GPIO.input( rightButton )

if offButton_state == GPIO.LOW:
print( "Off button pressed" )

if onButton_state == GPIO.LOW:
print( "On button pressed" )

if leftButton_state == GPIO.LOW:
keypress(leftArrow)
print( "Left button pressed" )

if rightButton_state == GPIO.LOW:
keypress(rightArrow)
print( "Right button pressed" )

time.sleep( 1 )

我已经阅读了 subprocess and Popen.communicate()但无法真正判断问题是否与此有关或与什么有关 xte is expecting as an argument .想法?

最佳答案

错误表明您的控制序列是字符串(即 unicode),但 Subprocess 似乎需要字节。

在函数 keypress 中,将序列转换为字节,如下所示:

if isinstance(sequence, str):
sequence = sequence.encode('ascii')

关于字节、字符串和 unicode 的非常好的文章可以在这里找到:https://nedbatchelder.com/text/unipain.html

关于python - 用 python 在 Raspbian 中模拟击键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42687885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com