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

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

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

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

Q&A

解決済

1回答

2443閲覧

psychopyでストループ課題作成中、GUIの問題により教示が正常に表示されない

aca_ffk

総合スコア3

Python

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

0グッド

0クリップ

投稿2021/04/21 06:15

編集2021/04/23 04:10

前提・実現したいこと

https://kunisatolab.github.io/main/how-to-psychopy.html#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB

上記サイトを参考にしてストループ課題を作っています。
現在は課題13までを完了し、一応課題自体は完成しています。
ほかのPCでこれを実行すると正常に表示されるが自身のPCだとうまくいきません。
参加者IDを取得するようにすると肝心の課題の表示が暗転してうまく表示できません。

###ここに質問の内容を詳しく
参加者IDを取得するようにすると肝心の課題の表示が暗転してうまく表示できません。
→#参加者IDを取得、のコードについて
dlg = gui.DlgFromDict(expInfo, title='Experiment', fixed=['dateStr'])
の記述を削除して実行するとそのようなエラーが出ないことを確認。
また、画面が暗転するタイミングは教示を出力する際のfor文中、
myWinをflip()で出力をするとき。
しかし上述した通り、
dlg = ~~
の記述がなければこれも正常に表示される。

そこで該当箇所を見ていただき、なぜ画面が暗転してしまうのか、どのようにコードを書けばうまく表示されるのかをご教示いただきたいです。

該当のソースコード

python

1# -*- coding: utf-8 -*- 2 3from psychopy import visual, core, event, gui, data, misc 4import numpy, os , random,time,csv 5 6 7#参加者IDの取得 8try: 9 expInfo = misc.fromFile('lastParams.pickle') 10except: 11 expInfo = {'Participant':'001'} 12 13expInfo['dateStr']= data.getDateStr() 14-------------------------------該当箇所--------------------------- 15dlg = gui.DlgFromDict(expInfo, title='Experiment', fixed=['dateStr']) 16if dlg.OK: 17 misc.toFile('lastParams.pickle', expInfo) 18else: 19 core.quit() 20 21----------------------------------------------------------------- 22 23results = [] 24 25 26 27 28 29colorDic = { 30 u'赤': {'rgb': ( 1, -1,-1), 'type': '1'}, 31 u'黄': {'rgb': ( 1, 1,-1), 'type': '2'}, 32 u'青': {'rgb': (-1, -1, 1), 'type': '3'} 33} 34 35charConditionList = [ 36 {'kanjiChar': u'赤', 'color': u'赤'}, 37 {'kanjiChar': u'黄', 'color': u'赤'}, 38 {'kanjiChar': u'青', 'color': u'赤'}, 39 {'kanjiChar': u'赤', 'color': u'黄'}, 40 {'kanjiChar': u'黄', 'color': u'黄'}, 41 {'kanjiChar': u'青', 'color': u'黄'}, 42 {'kanjiChar': u'赤', 'color': u'青'}, 43 {'kanjiChar': u'黄', 'color': u'青'}, 44 {'kanjiChar': u'青', 'color': u'青'} 45] 46 47text = '今から色のついたもじがでてきます。\n文字の意味ではなく文字の色に基づいて\nボタンをおしてください。\n文字が赤色ならキーボードの1を、\n黄色なら2を、青色なら3をおしてください。\nこの指示が読めたらスペースキーを押してください\n' 48 49myWin = visual.Window(fullscr=True, monitor="Default", allowGUI=False, units="norm", color=(1,1,1)) 50instText = visual.TextStim(myWin,text = text,pos=(0,0),color = (-1,-1,-1),height=0.1) 51 52instText.draw() 53myWin.flip() 54 55keyList = event.waitKeys(keyList=['space']) 56 57#反応時間計測のための設定 58stopwatch = core.Clock() 59 60M=1 61N = len(charConditionList) 62 63for m in range(M): 64 r = list(range(N)) 65 numpy.random.shuffle(r) 66 for i, currentState in enumerate(r): 67 myWin = visual.Window(fullscr=True, monitor="Default", allowGUI=False, units="norm", color=(1,1,1)) 68 charCondition = charConditionList[currentState] 69 colorData = colorDic[charCondition['color']] 70 kanjiCharData = colorDic[charCondition['kanjiChar']] 71 char = charCondition['kanjiChar'] 72 myText = visual.TextStim(myWin,text = char,pos=(0,0),color = colorData['rgb'],height=0.2) 73 myText.draw() 74 myWin.flip() 75 76 #参加者の反応測定開始 77 #前回の刺激提示の影響を消去する 78 event.clearEvents() 79 80 #ストップウォッチをリセット 81 stopwatch.reset() 82 #参加者の反応をリセット 83 Responded = False 84 85 #ストップウォッチをリセットしてからstopwatch.getTime()で測定した時間が一秒を超えるまで以下の処理を実行 86 while stopwatch.getTime() < 1: 87 #もしこれまでに反応がないようなら event.waitKeysで反応を抜き出す 88 #Respondedには反応と反応時間が入る 89 if not Responded: 90 Responded = event.getKeys(keyList=['1','2','3'],timeStamped=stopwatch) 91 92 #もし一秒たっても反応がないならno responseと反応時間なしで処理する 93 if not Responded: 94 Responded = [('no respose', 0)] 95 96 #参加者の測定終了 97 98 99 #正解と不正解のフィードバック 100 if Responded[0][0] == 'no respose': 101 fbText = visual.TextStim(myWin, text = u'無反応',pos=(0,-0.3),color=(-1,-1,-1),height=0.2) 102 rtText = visual.TextStim(myWin, text = str(Responded[0][1])+u'秒',pos=(0,-0.5),color=(-1,-1,-1),height=0.2) 103 #保存用の結果 104 correctIncorrect = None 105 106 elif Responded[0][0] == colorData['type']: 107 fbText = visual.TextStim(myWin, text = u'正解',pos=(0,-0.3),color=(-1,-1,-1),height=0.2) 108 rtText = visual.TextStim(myWin, text = str(Responded[0][1])+u'秒',pos=(0,-0.5),color=(-1,-1,-1),height=0.2) 109 #保存用の結果 110 correctIncorrect = True 111 else: 112 fbText = visual.TextStim(myWin, text = u'不正解',pos=(0,-0.3),color=(-1,-1,-1),height=0.2) 113 rtText = visual.TextStim(myWin, text = str(Responded[0][1])+u'秒',pos=(0,-0.5),color=(-1,-1,-1),height=0.2) 114 #保存用の結果 115 correctIncorrect = False 116 117 #上記で設定したフィードバックと反応時間の書き込み 118 fbText.draw() 119 rtText.draw() 120 121 kanjiCharType = kanjiCharData['type'] 122 colorType = colorData['type'] 123 124 #一試行の結果の保存 125 results.append([ 126 N*m + i, 127 kanjiCharType, 128 colorType, 129 colorType==kanjiCharType, 130 Responded[0][0], 131 correctIncorrect, 132 Responded[0][1] 133 ] 134 ) 135 136 137 138 139 myText = visual.TextStim(myWin,text = u'+',pos=(0,0),color = (-1,-1,-1),height=0.2) 140 myText.draw() 141 myWin.flip() 142 core.wait(1) 143 144#最終的な結果を保存 145curD = os.getcwd() 146datafile=open(os.path.join(curD, 'log', 'Sub{0}_{1}.csv'.format(expInfo['Participant'], expInfo[ 'dateStr'])),'wb') 147 148datafile.write(b'trial, meaning, color, congruent, response, correct, RT\n') 149for r in results: 150 datafile.write('{0}, {1}, {2}, {3}, {4}, {5}, {6}\n'.format(*r).encode()) 151datafile.close() 152 153 154

###エラーメッセージ
7.8584 WARNING Monitor specification not found. Creating a temporary one...
7.8749 WARNING User requested fullscreen with size [800 600], but screen is actually [1920, 1080]. Using actual size
それぞれ、課題の教示がプログラム上のfor文で実行されるたびにこのエラーが排出される。
ただ、ほかのPCではこのエラーが出ても正常に表示されているため本質的な問題ではないように感じられる。

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

pythonは3.Xのバージョンを使用中。
また、使用ライブラリはpsychopy3

OSはWindows 10 Pro
バージョンは20H2
OSビルドは19042.928

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

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

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

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

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

etherbeg

2021/04/21 21:53 編集

質問文からは分からないこと: ①「現在は課題14までを完了し、一応課題自体は完成してい」る、の言葉の意味。課題14までのプログラムは完成して問題なく動いているということか? ②おそらく①と関係するが、「課題14までを完了し、一応課題自体は完成」と「参加者IDを取得するようにする」の関係。言い換えると、「参加者IDを取得するようにする」はどこの時点で行ったのか。すでにちゃんと動いている「課題14まで」のプログラムに「参加者IDを取得するように」プログラムを追加もしくは改変したら望んだように動かなくなったのか?次の課題15の一部にそれがあるのか? ③「参加者IDを取得するようにする」ために行ったことの内容。それがプログラムに追記したり変更したりしたことなら、それ以前のちゃんと動いていたプログラムに対して、それ以後の動かなくなった時のプログラムの追加部分・変更部分はどこか、正確に。 ④「課題の表示が暗転」「画面が暗転」の具体的様子。スクリーンショットがないと分からない。 ⑤「課題の表示が暗転」「画面が暗転」がどこで発生するのか具体的に。プログラムを実行するとおそらくすぐにダイアログが表示されるのだろうと思うが、そこでか、それともその先に進んだどこかのダイアログの表示でか。 以上がわかるように質問を修正・追記してください。
etherbeg

2021/04/21 23:09

あとPsychoPyの「出力」タブに何かエラーメッセージが出力されていたら、出力されている文字を全て、質問文中に転記してください。
etherbeg

2021/04/22 03:10

あとOSの種別とバージョンも記載をお願いします。
aca_ffk

2021/04/23 04:07

ご指摘いただいた通り、質問内容を更新いたしました。 課題の進捗については申し訳ございませんが、「13まで」の誤りです。
etherbeg

2021/04/23 23:27 編集

他のPCでは動くって、もし環境依存の問題だとしたら一番厄介ですね。実際私の環境(macOS 11.1, Intel, Python 3.8.3, PsychoPy 2021.1.3)でも試してみましたが、一応動いてますしね。正直お手上げです。 関係あるか分かりませんが、参考にされているページの一番下から、そこの先生が書かれたソースコードをダウンロードできますが、それと見比べてみると、質問者さんのコードにはある内側のforループの中の myWin = visual.Window(fullscr=True, monitor="Default", allowGUI=False, units="norm", color=(1,1,1)) という一文が、先生のコードにはないように見えます。この一文を足したのには何か理由ありますか?
aca_ffk

2021/04/26 05:02

お世話になっております。研究室のPCを使用しているためご返信がおそくなってしまい申し訳ございません。 etherbegさんのご指摘の通り、forループ中の該当のコードを削除したところ問題なく表示させることができました。 該当のコードを残していた理由としては、課題作成を段階的に行っており、それぞれのコードの意味を深く理解せずに重複してコードを記述していたことが原因です。 これは環境依存の問題かもしれないですが、私のPCではウィンドウを立ち上げる際にどうも暗転してしまうようです。そのため課題の教示の際に毎回ウィンドウを立ち上げ、都度暗転してしまうため課題が正常に教示されていないように見えていたのだと考えられます。 結局は私のコードに問題があったということで、etherbegさんには多大な時間と労力を使わせてしまい申し訳ございません。また、質問修正依頼や、問題点の指摘などをしていただき私もかなり勉強になりました。ほんとうにありがとうございました。 ベストアンサーを差し上げたいので、何でも良いので回答を記入していただければ幸いです。 よろしくお願いいたします。
etherbeg

2021/04/26 16:25

丁寧なお返事をいただきありがとうございます。 改めて確認してみたら、私の環境 (macOS) でも、最初のOKボタンを押した後、「今から色のついたもじがでてきます〜」の表示が出てくるまでの間に、一瞬(0.2秒ぐらい?)画面が真っ暗になっていました。ライブラリとして正常な動作なのか、それともライブラリのユーザとして可能な設定や調整をしていない結果なのか、それともプログラムに問題があるのか(PsychoPy3に合わせたプログラムになってないとか)…、ちょっと気になりますね。 解答欄の方には、質問文に書かれているプログラムで、Python3に対応するために直した方がいい箇所について書かせていただきました。参考にされたページのプログラムは、Pythonプログラムとしては問題が多いです。説明も間違っている所があります。参考にするプログラムとしては、そのページからもリンクされている https://qiita.com/snishym/items/8b52db0d901cf5744463 のプログラムの方がいいです。 私は心理学の実験のことはまったくわからないのですが、Pythonのプログラムのことなら多少わかることもあるので、また何か問題があったら書き込んでいただいたら、一緒に解決法を考えさせていただきます。研究頑張ってください。
guest

回答1

0

ベストアンサー

問題の方は解決されたようなので、ここでは質問文に書かれているプログラムで、Python3に対応するために直した方がいい箇所について書かせていただきます。何か質問あればコメントに書き込んでください。


Python

1# -*- coding: utf-8 -*-

これは「このソースコードはUTF-8という文字エンコーディングで書かれている」ということを示すものですが、Python3ではこれは不要です。ソースコードはUTF-8で書かれていることをデフォルトで前提としているからです。


Python

1colorDic = { 2 u'赤': {'rgb': ( 1, -1,-1), 'type': '1'}, 3 u'黄': {'rgb': ( 1, 1,-1), 'type': '2'}, 4 u'青': {'rgb': (-1, -1, 1), 'type': '3'} 5}

Python3では日本語の前にuは不要です。↓

Python

1colorDic = { 2 '赤': {'rgb': ( 1, -1,-1), 'type': '1'}, 3 '黄': {'rgb': ( 1, 1,-1), 'type': '2'}, 4 '青': {'rgb': (-1, -1, 1), 'type': '3'}

でいいです。その他の箇所も同様です。


Python

1datafile=open(os.path.join(curD, 'log', 'Sub{0}_{1}.csv'.format(expInfo['Participant'], expInfo[ 'dateStr'])),'wb') 2 3datafile.write(b'trial, meaning, color, congruent, response, correct, RT\n') 4for r in results: 5 datafile.write('{0}, {1}, {2}, {3}, {4}, {5}, {6}\n'.format(*r).encode()) 6datafile.close()

テキストファイルに文字列を書き込むときは、open(filepath, 'wb') ではなく(これはPython2でも間違い)、open(filepath, 'w') とします。

それに応じて、
b'trial, meaning, color, congruent, response, correct, RT\n’
'trial, meaning, color, congruent, response, correct, RT\n'
に直してください。

'{0}, {1}, {2}, {3}, {4}, {5}, {6}\n'.format(*r).encode()
'{0}, {1}, {2}, {3}, {4}, {5}, {6}\n'.format(*r)
に直してください。
多分エラーが出るので上記の箇所を直したのだと思いますが、その大元の原因は open(filepath, 'wb') です。

修正後は以下のようになります。

Python

1datafile=open(os.path.join(curD, 'log', 'Sub{0}_{1}.csv'.format(expInfo['Participant'], expInfo[ 'dateStr'])),'w') 2 3datafile.write('trial, meaning, color, congruent, response, correct, RT\n') 4for r in results: 5 datafile.write('{0}, {1}, {2}, {3}, {4}, {5}, {6}\n'.format(*r)) 6datafile.close()

これは必須ではありませんが、with open ~ as構文を使うと、明示的にファイルをcloseしなくても、自動的にcloseしてくれます。書き込みの途中で例外が生じて処理がストップした場合でも、closeしてくれます。

修正後は以下のようになります。

Python

1with open(os.path.join(curD, 'log', 'Sub{0}_{1}.csv'.format(expInfo['Participant'], expInfo[ 'dateStr'])),'w') as datafile: 2 datafile.write('trial, meaning, color, congruent, response, correct, RT\n') 3 for r in results: 4 datafile.write('{0}, {1}, {2}, {3}, {4}, {5}, {6}\n'.format(*r))

参考ページの説明で、明らかに間違っている箇所について。「課題1」のところ。

ヒント プログラミングをするとかならずエラーが生じます。 エラーがあったら,以降の処理をストップして,エラーを報告してくれる方法として, try-except文があります。これをつかうと,try以降のプログラム(以下では”なんらかの処理”) にエラーが生じるとその内容を表示してくれます。

try :
なんらかの処理
except TypeError, e:
print e

これは明らかな間違いです。理解せずにtry-except文を使っているために、示されているコードも(本来のtry-except文の用途から言えば)無意味なものになっています。
try-except文で処理されるエラーは「例外」と呼ばれるエラーですが、try-except文を使わなくても、例外は最初から、「以降の処理をストップして,エラーを報告してくれる」ものです。
try-except文はむしろ逆に、予想される例外に対して、例外が発生してもプログラムをストップせず、例外に応じた処理を行いたいときに使います。try-except文を使うことによって、エラーの詳細はむしろ、ユーザの目から隠されます。try-except文でプログラム全体を囲むようなことは、自分のやっていることの意味をわかって意図的にするのでない限りは、絶対にしてはいけないことです。

投稿2021/04/26 16:22

編集2021/04/26 16:35
etherbeg

総合スコア1195

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

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

aca_ffk

2021/04/27 07:12

一週間に渡りお世話になりました。 回答でも、コードについて予想以上に丁寧に詳細に改善点を指摘していただき誠にありがとうございます。 まだまだプログラミング初心者で至らないところばかりだな、と強く実感しています。 今回いただいた改善点も含めて、今後もプログラミング学習に邁進してまいります。 また、最後には温かいお言葉をいただきありがとうございます。 心強い味方がいると思うと、今後もより一層学習に力を入れることができそうです。 今後ともお世話になることがあるかと思いますが、その時は何卒よろしくお願いいたします。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問