2017-03-09 13 views
3

ボタン押下(GPIOピンを利用)後に左または右のキーストロークを送信する方法を理解しようとすると、this questionがつまずきました。RaspbianのキーストロークをPythonでシミュレート

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 

私はRaspbianジェシーに、パイ3モデルB上のpython3を実行しているピクセルで(raspberrypi.orgからダウンロード)

:私は次のエラーを取得しておく)そのままのコードを持つファイルなぜそれが間違っているのですか?

私がしようとしているのは、ユーザーがFEHスライドショーで左右にスクロールできるようにすることだけです...このアプローチでは、です。私は完全に私のためにこれを解決する誰かを探しているわけではない - 私はコーディングに関連した挑戦が好きです - 私はちょうどパイソンの超新しいです。正しい方向に私を振り向かせることは非常に役立つでしょう。

何か助力が大変ありがとうございます。

編集:コードを含めないと申し訳ありません!

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とは何かを持っていた場合、本当に言うことができませんでした。思考?

+1

質問に関連コードを追加してください。 –

答えて

1

エラーは、制御シーケンスが文字列(つまりユニコード)であるが、サブプロセスがバイトを予期しているように見えることを示します。機能keypress

、そのようなバイトにシーケンスを変換します。私が見てきたhttps://nedbatchelder.com/text/unipain.html

+0

聖なる牛!!!それは魅力のように働いた、ありがとう!私は左右の矢印のために異なるシーケンスを定義しましたが、どちらも私にスペースを与えています。 –

+0

また、これはすばらしい書き込みです。共有いただきありがとうございます! –

0

:バイト、文字列、およびUnicodeがここで見つけることができる程度

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

非常に良い過去記事同じ例で、ここでは6つのボタンのための私の作業例を示します(それは多少厄介だが、私のデバッグラインがあまりにも他人を助けるかもしれない)

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

buttons = [18,   23,   24,   25,  8,  7 ] 
opcodes = ['next', 'enter', 'alt tab', 'previous', 'spacebar', 'shift' ] 
opcodes2 = ['key Left ', 'key Up ', 'key Down ', 'key Right ', 'key Enter ', 'key Shift_L '] 

# set the gpio pins 
for button in buttons: 
    GPIO.setup(button, GPIO.IN, GPIO.PUD_UP) 

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

def main(): 
    while True: 
     button_state = [] 
     for button in buttons: 
      button_state.append(GPIO.input(button)) 

     for item in range(len(button_state)): 
      if button_state[item] == 0: 
       print (opcodes2[item]) #debugging 
      # send X key for keystroke in (for the given iteration of the loop) opcodes[button.output(index)] 
       #print (repr(str(opcodes2[item]).encode('ascii'))) 
       keypress(str(opcodes2[item]).encode('ascii')) 
     print (repr(button_state)) #for debugging 
     time.sleep(0.3) 
     del button_state 

if __name__ == '__main__': 
    main() 

では、コマンドごとにopcodes2内の末尾の空白(任意のcharとすることができます)を書き留めます。 ASCIIエンコードは私の最後の文字をドロップしていたので、これは私のやや醜い回避策です。

関連する問題