質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2623閲覧

キー入力による条件分岐(psychopyのbuilderから作成)

erumorumo

総合スコア2

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/11/05 11:54

編集2021/11/07 20:54

前提・実現したいこと

キー入力による条件分岐

発生している問題・エラーメッセージ

実行はするのですが、すべてelseの方に飛びます。

該当ソースコード

python

1(前略) 2key_resp_2 = keyboard.Keyboard() 3 4(変更部分) 56text_5 = visual.TextStim(win=win, name='text_5', 7 text=test5, 8 font='Open Sans', 9 pos=(0, 0), height=0.1, wrapWidth=None, ori=0.0, 10 color='white', colorSpace='rgb', opacity=None, 11 languageStyle='LTR', 12 depth=-6.0); 13                                                                     』 14 15(略) 16 17key_resp_2.keys=[] 18key_resp_2.rt = [] 19_key_resp_2_allKeys = [] 20 21 # *key_resp_2* updates 22 waitOnFlip = False 23 if key_resp_2.status == NOT_STARTED and tThisFlip >= 5.0-frameTolerance: 24 # keep track of start time/frame for later 25 key_resp_2.frameNStart = frameN # exact frame index 26 key_resp_2.tStart = t # local t and not account for scr refresh 27 key_resp_2.tStartRefresh = tThisFlipGlobal # on global time 28 win.timeOnFlip(key_resp_2, 'tStartRefresh') # time at next scr refresh 29 key_resp_2.status = STARTED 30 # keyboard checking is just starting 31 waitOnFlip = True 32 win.callOnFlip(key_resp_2.clock.reset) # t=0 on next screen flip 33 win.callOnFlip(key_resp_2.clearEvents, eventType='keyboard') # clear events on next screen flip 34 if key_resp_2.status == STARTED: 35 # is it time to stop? (based on global clock, using actual start) 36 if tThisFlipGlobal > key_resp_2.tStartRefresh + 3.0-frameTolerance: 37 # keep track of stop time/frame for later 38 key_resp_2.tStop = t # not accounting for scr refresh 39 key_resp_2.frameNStop = frameN # exact frame index 40 win.timeOnFlip(key_resp_2, 'tStopRefresh') # time at next scr refresh 41 key_resp_2.status = FINISHED 42 if key_resp_2.status == STARTED and not waitOnFlip: 43 theseKeys = key_resp_2.getKeys(keyList=['f', 'j'], waitRelease=False) 44 _key_resp_2_allKeys.extend(theseKeys) 45 if len(_key_resp_2_allKeys): 46 key_resp_2.keys = _key_resp_2_allKeys[-1].name # just the last key pressed 47 key_resp_2.rt = _key_resp_2_allKeys[-1].rt 48 49(変更部分) 5051 if key_resp_2.keys == 'f': 52 test5='あたり' 53 else: 54 test5='ハズレ' 55                                                                         56 57if text_5.status == NOT_STARTED and tThisFlip >= 8.0-frameTolerance: 58 # keep track of start time/frame for later 59 text_5.frameNStart = frameN # exact frame index 60 text_5.tStart = t # local t and not account for scr refresh 61 text_5.tStartRefresh = tThisFlipGlobal # on global time 62 win.timeOnFlip(text_5, 'tStartRefresh') # time at next scr refresh 63 text_5.setAutoDraw(True) 64 if text_5.status == STARTED: 65 # is it time to stop? (based on global clock, using actual start) 66 if tThisFlipGlobal > text_5.tStartRefresh + 1.0-frameTolerance: 67 # keep track of stop time/frame for later 68 text_5.tStop = t # not accounting for scr refresh 69 text_5.frameNStop = frameN # exact frame index 70 win.timeOnFlip(text_5, 'tStopRefresh') # time at next scr refresh 71 text_5.setAutoDraw(False) 72                                                                                      』 73 (略) 74 75if key_resp_2.keys in ['', [], None]: # No response was made 76 key_resp_2.keys = None 77thisExp.addData('key_resp_2.keys',key_resp_2.keys) 78if key_resp_2.keys != None: # we had a response 79 thisExp.addData('key_resp_2.rt', key_resp_2.rt) 80thisExp.addData('key_resp_2.started', key_resp_2.tStartRefresh) 81thisExp.addData('key_resp_2.stopped', key_resp_2.tStopRefresh) 82

試したこと

fを入力すると当たりという文字を表記したいのですが、ハズレという文字しか表記されません。

補足情報(FW/ツールのバージョンなど)

ある課題の一部分です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

python

1() 2text_5 = visual.TextStim(win=win, name='text_5', 3 text='', 4 font='Open Sans', 5 pos=(0, 0), height=0.1, wrapWidth=None, ori=0.0, 6 color='white', colorSpace='rgb', opacity=None, 7 languageStyle='LTR', 8 depth=-6.0); 9() 10# *key_resp_2* updates 11 waitOnFlip = False 12 if key_resp_2.status == NOT_STARTED and tThisFlip >= 5.0-frameTolerance: 13 # keep track of start time/frame for later 14 key_resp_2.frameNStart = frameN # exact frame index 15 key_resp_2.tStart = t # local t and not account for scr refresh 16 key_resp_2.tStartRefresh = tThisFlipGlobal # on global time 17 win.timeOnFlip(key_resp_2, 'tStartRefresh') # time at next scr refresh 18 key_resp_2.status = STARTED 19 # keyboard checking is just starting 20 waitOnFlip = True 21 win.callOnFlip(key_resp_2.clock.reset) # t=0 on next screen flip 22 win.callOnFlip(key_resp_2.clearEvents, eventType='keyboard') # clear events on next screen flip 23 if key_resp_2.status == STARTED: 24 # is it time to stop? (based on global clock, using actual start) 25#---------------ここから新たに挿入------------------------------------ 26 theseKeys = key_resp_2.getKeys(keyList=['f', 'j'], waitRelease=False) 27 key2 = theseKeys 28 for key in key2: 29 if key.name =='f': 30 text_5.setText(test1) 31 else: 32 text_5.setText('はずれ') 33#----------------ここまで-------------------------------------------------------- 34 if tThisFlipGlobal > key_resp_2.tStartRefresh + 3.0-frameTolerance: 35 # keep track of stop time/frame for later 36 key_resp_2.tStop = t # not accounting for scr refresh 37 key_resp_2.frameNStop = frameN # exact frame index 38 win.timeOnFlip(key_resp_2, 'tStopRefresh') # time at next scr refresh 39 key_resp_2.status = FINISHED 40 if key_resp_2.status == STARTED and not waitOnFlip: 41 42 _key_resp_2_allKeys.extend(theseKeys) 43 if len(_key_resp_2_allKeys): 44 key_resp_2.keys = _key_resp_2_allKeys[-1].name # just the last key pressed 45 key_resp_2.rt = _key_resp_2_allKeys[-1].rt

投稿2021/11/09 03:59

erumorumo

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こういった場合はまずprint関数で出力してみて、実際にそこに入っている値が何かを確認します。
つまり f のキーを押した時のこの出力が本当に 'f' という文字列になっているかどうかを確認します。

python

1key_resp_2 = keyboard.Keyboard() 2 3print(str(key_resp_2.keys)) # <= ここで出力される値を確認する 4 5if str(key_resp_2.keys) == 'f': 6 test5='あたり' 7else: 8 test5='ハズレ'

コメントを受けての1回目の追記:

私の手元でもPsychoPy Builderから生成されたプログラムを確認してみましたが、「該当ソースコード」に記載されているソースコードは、前後に省略があるだけでなく、中間部分にも省略されている箇所がありますね?
プログラムの質問サイトで質問する際に、省略した部分を明記せずにソースコードを記載するのはよくないですね。日本語で「(前略)」とか「(略)」とかでいいので、省略した部分に書いて、省略していることがわかるようにしたほうがいいです。

おそらくBuilderのComponentsのResponsesの中から、Keyboardコンポーネントを追加されたと思うのですが、そのコンポーネントでのキー入力の結果を受けて条件分岐したい、ということで間違いないですか?

以下で一度お試しください。

python

1 # *key_resp_2* updates 2 waitOnFlip = False 3 if key_resp_2.status == NOT_STARTED and tThisFlip >= 5.0-frameTolerance: 4 (略) 5 if key_resp_2.status == STARTED: 6 (略) 7 if key_resp_2.status == STARTED and not waitOnFlip: 8 theseKeys = key_resp_2.getKeys(keyList=['f', 'j'], waitRelease=False) 9 _key_resp_2_allKeys.extend(theseKeys) 10 if len(_key_resp_2_allKeys): 11 key_resp_2.keys = _key_resp_2_allKeys[-1].name # just the last key pressed 12 key_resp_2.rt = _key_resp_2_allKeys[-1].rt 13 if key_resp_2.keys == 'f': 14 test5 = 'あたり' 15 else: 16 test5 = 'ハズレ'

コメントを受けての2回目の追記:

私の実行環境は macOS Big Sur 11.6、PsychoPy v2021.02.03 Standalone版です。

まず

python

1text_5 = visual.TextStim(win=win, name='text_5', 2 text=test5, 3 font='Open Sans', 4 pos=(0, 0), height=0.1, wrapWidth=None, ori=0.0, 5 color='white', colorSpace='rgb', opacity=None, 6 languageStyle='LTR', 7 depth=-6.0);

の箇所を次のように変更してください。

python

1text_5 = visual.TextStim(win=win, name='text_5', 2 text=None, 3 font='ヒラギノ角ゴシック', 4 pos=(0, 0), height=0.1, wrapWidth=None, ori=0.0, 5 color='white', colorSpace='rgb', opacity=None, 6 languageStyle='LTR', 7 depth=-6.0);

textはNoneに設定します。Builderでtext欄を空欄にしてもこのように設定されます。
fontは日本語表示する場合は日本語のフォントに変更します(そうしないと私の環境では表示が崩れました。質問者さんの環境で表示が崩れていないようであれば、元のままでもいいです)。ここでは「ヒラギノ角ゴシック」にしました。

次に

python

1 if key_resp_2.keys == 'f': 2 test5 = '当たり' 3 else: 4 test5 = 'ハズレ'

の箇所を次のように変更してください。

python

1 if key_resp_2.keys == 'f': 2 text_5.text = '当たり' 3 else: 4 text_5.text = 'ハズレ'

test5がtext_5.textに変わっていることに注意してください(test5.textではない)。
また「該当ソースコード」のこの箇所のコードは、微妙に行頭がズレているのでそれも修正しておいてください(行頭にスペース1個分だけ余計なインデントが入っている)。

以上を一度お試しください。

投稿2021/11/05 12:31

編集2021/11/08 05:55
etherbeg

総合スコア1195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

erumorumo

2021/11/05 15:57

回答ありがとうございます。試してみたのですが、[ ]という文字が出て、やはりelseの方に飛んでしまいます。 該当ソースコードの方を修正致しましたので、再度お教えいただければ幸いです。
etherbeg

2021/11/05 16:26

「[ ]という文字が出」たということは、「elseの方に飛んでしま」って当然(プログラムの動作としてはそれで正しい)ということなのですが、それは理解されていますか? 急にコードが増えましたがこれがbuilderから書き出されたプログラムのすべてをそのまま転記したものですか? 手を加えていませんか? このコードだとそもそもエラーが出て実行できないはずなのですが。
etherbeg

2021/11/05 22:38 編集

ちょっと言葉が足りなかったと思うので補足します。 質問タイトルから、psychopyのbuilderから書き出したプログラムの質問だろうと漠然と思っていたのですが、回答の際はそこのことは忘れて回答していました。私の回答は、プログラムが自分の思ったように動かない際に行うべき、ごく基本的な調査方法について案内したものです。 しかしコメントを受けてよく考えてみると、Builderはプログラムを書かなくてもよいようにあるものなので、そこから書き出されたプログラムがちゃんと動かないというのはおかしなことです。 そこでやっと、書き出されたプログラムに手を加えているのではないかという可能性に思い至りました。 もし手を加えているとしたら、それはやりたいことがBuilderでは実現できないからでしょうか? あるいは直接プログラムを書けるように、勉強も兼ねてでしょうか? いずれにせよ、断片のプログラムを通したやりとりで問題が解決しないのならば、 ・上に述べたようなプログラム作成の経過や意図をちゃんと説明していただくこと ・プログラムの一部ではなく全体を提示していただくこと ・Builderから書き出したプログラムに手を加えている場合は、元のままのプログラムと、手を加えたプログラムの両方記載するとともに、区別がつくようにすること、 ・使用しているOSの種類とバージョン、およびpsychopyのバージョンを明記すること といったことが必要です。
erumorumo

2021/11/07 14:34

再度、回答ありがとうございます。 []がelseの方に飛ぶことは理解しています。 試したいことが、builderからだと実行できないです。 手を加えている箇所は、初めのif文しかありません。 プログラム全体を提示するのが文字数上限でできなかったため、一部しか提示できませんでした。 使用しているosは、macmonterey12.0.1です。psychopyは、psychopy.v.3です。
etherbeg

2021/11/07 19:59

回答に追記しましたのでご確認ください。
erumorumo

2021/11/07 20:59

度々、回答ありがとうございます。また、質問の仕方まで教えていただきありがとうございます。 前後に省略している箇所があります。 keyboardコンポーネントからのキー入力の結果を受けての条件分岐したいということで間違い無いです。 先ほど回答していただいた通りに変更してみたのですが、「text=test5, NameError: name 'test5' is not defined」というエラーが出て、実行できませんでした。 該当コードにtest5部分に関してのコードの方も提示さしていただきました。
etherbeg

2021/11/08 05:59

(「_key_resp_2_allKeys = []」の後ろ(「# *key_resp_2* updates」の前)にもコードの省略がありませんか?) コードの意図としては、keyboardコンポーネントで入力されたキーの種類(fかj)に応じて、次のTextコンポーネントでユーザに提示するテキストの内容を変更する(fなら「あたり」、jなら「ハズレ」)、ということで間違いありませんか? 再度回答に追記しましたのでご確認ください。 ちなみに私の実行環境は macOS Big Sur 11.6、PsychoPy v2021.02.03 Standalone版です。これも念のため回答に追記しました。 ----- ところで今回は私の要請を受けて「(変更部分)」とか「(略)」とかを追記してくれているので今のままでも構いませんが、もしご自分でも、ここは後で自分で挿入した箇所とわかるようにしておきたいとか、ここは後で自分で変更した箇所とわかるようにしておきたい場合は、Pythonのコメント(#)をうまく使うといいですよ。例えば、 # ------- ここから新たに挿入 ----------- 自分で挿入したコード 自分で挿入したコード 自分で挿入したコード # ------- ここまで -------- とか、 # 変更する前のコード 変更後のコード # ↑うまく動かなかったらすぐに戻せるように変更前のコードも残しておく といったように、Pythonのコメント文法を使ってコメントを残しておくと、コメントを残したままプログラムを実行できるので便利ですよ(「(変更部分)」とかだと、書いたまま実行したらエラーになる)。 あるいは複数行のブロックを一時的に無効にして実行したいような場合には、次のようにブロックの前後を """ と """ で囲んで無効にすることもよく行われます。 """ 無効にしたいブロックのコード 無効にしたいブロックのコード 無効にしたいブロックのコード """ """ は二重引用符3つです。これは正確にはコメントアウトしているのではなく、囲んだ部分を無名の文字列オブジェクトにして、プログラム的に無効にしています。 以上、すでにご存知かもしれませんが念のため補足しました。
etherbeg

2021/11/08 08:11

今のプログラムだとキーを何も押さなかった場合も「ハズレ」と表示されませんか?
erumorumo

2021/11/09 03:56

回答ありがとうございます。 key_resp_2.allkeys=[]の後ろにも省略があります。記載を忘れていました。申し訳ないです。 コードの意図はおっしゃる通りで間違い無いです。 なるほど、そのようなことができるんですね。知らなかったので、とても助かります。 何も押さない場合、ハズレと表示されます。 回答していただいたコードを元に、試行錯誤してみた結果、無事にプログラムがうまく実行できました。 簡単に自分がしたことを説明しますと、[ theseKeys]の箇所を他のものに置き換えて、[key_resp_2.keys]の箇所と置き換えることで、うまくいきました。 本当に何度もご回答していただきありがとうございました。 一応、変更したコードを自己解決の方に載せておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問