我想显示一个对话框,要求实验参与者输入一个数字,使用psychopy。当"fullscr=False
"在win时,弹出对话框。当fullscr=True
时,它不出现,即使输入数字然后返回,也会使程序进入下一个循环。
知道为什么吗?相关代码行如下
from psychopy import visual, event, core, data, gui, logging
win = visual.Window([1024,768], fullscr=True, units='pix', autoLog=True)
respInfo={}
respInfo['duration']=''
respDlg = gui.DlgFromDict(respInfo)
这是因为当fullscr=True
时,psychopy窗口位于其他所有内容的顶部,因此在您的示例中,对话框被创建但对用户不可见,因为窗口位于顶部。
对话框在开头
如果您只想在实验开始时显示对话框,解决方法很简单:在创建窗口之前显示对话框:
# Import stuff
from psychopy import visual, gui
# Show dialogue box
respInfo={'duration': ''}
respDlg = gui.DlgFromDict(respInfo)
# Initiate window
win = visual.Window(fullscr=True)
中间出现对话框
如果你想在实验过程中显示对话,你需要一个相当复杂的hack。你需要
- 关闭当前窗口
- 显示对话框(可选择在后台有一个非全屏窗口,以覆盖您的桌面)
- 创建一个新窗口(并关闭步骤2中的可选窗口)
- 设置在新窗口中呈现的所有刺激。由于刺激指向第一个窗口对象,因此仅使用相同的变量名称创建一个新窗口(新对象)将无法达到此目的。
下面的一些代码用单个刺激来演示这种方法:
# Import stuff, create a window and a stimulus
from psychopy import visual, event, gui
win1 = visual.Window(fullscr=True)
stim = visual.TextStim(win1) # create stimulus in win1
# Present the stimulus in window 1
stim.draw()
win1.flip()
event.waitKeys()
# Present dialogue box
win_background = visual.Window(fullscr=False, size=[5000, 5000], allowGUI=False) # optional: a temporary big window to hide the desktop/app to the participant
win1.close() # close window 1
respDict = {'duration':''}
gui.DlgFromDict(respDict)
win_background.close() # clean up the temporary background
# Create a new window and prepare the stimulus
win2 = visual.Window(fullscr=True)
stim.win = win2 # important: set the stimulus to the new window.
stim.text = 'entered duration:' + respDict['duration'] # show what was entered
# Show it!
stim.draw()
win2.flip()
event.waitKeys()