Написать код, который позволит пользователю пройтись по списку нажатиями стрелочек на клавиатуре
Пишу программу для психологического эксперимента. Суть в том, что пользователь сперва выбирает определенный набор картинок. Уже на этом этапе возникла проблема: в программировании новичок, поэтому не удивительно. Вот что я попытался сделать:
choise_list=['ss', 's', '', 'b', 'bb'] # список, хранящий добавления к именам картинок
c = 2 # индекс дефолтного элемента списка, т.е. пустого
choise = choise_list[c]
def setfunction(choise): # функция показывает три картинки
stimnames=['mc','mo','msf'] # список имён картинок
setting={} # здесь будут пути к картинкам
ext='.png'
mypath='./'
win = visual.Window(fullscr=True, size=(1920,1080), color=(backcolor,backcolor,backcolor), colorSpace='rgb255')
cross=visual.TextStim(win,text='+',pos=(0.0,0.0))
for pic in stimnames:
setting[pic] = visual.ImageStim(win,mypath+pic+choise+ext) # заполняет словарь с путями к картинкам
setting['mc'].pos=(-0.5,0)
setting['mc'].draw(win)
setting['mo'].pos=(0.5,0.5)
setting['mo'].draw(win)
setting['msf'].pos=(0.5,-0.5)
setting['msf'].draw(win)
cross.draw(win)
win.flip() # эти строчки показывают собственно картинку
setfunction(choise)
key_f=event.waitKeys(keyList=['left', 'right', 'escape', 'enter'])
if key_f[0] == ['left']:
c -= 1
setfunction(choise)
elif key_f[0] == ['right']:
c += 1
setfunction(choise)
elif key_f[0] == ['enter']:
display_text_msg("Вашей задачей будет"+"\n"+"qwe qwe qwe"+"\n"+"re re rer")
Мне нужно, чтобы при нажатии определенной клавиши функция выполнялась уже с другим значением аргумента choice . Для этого я изменяю переменную, в которой содержится индекс списка добавочных значений. Но ничего не происходит. И никаких ошибок. При нажатии клавиш left, right и enter программа просто заканчивается.
Ответы (1 шт):
Изменяя переменную c вы не изменяете содержимое переменной choice.
Измените свой код так (строки с изменениями отмечены комментарием # <-----):
choise_list=['ss', 's', '', 'b', 'bb'] # список, хранящий добавления к именам картинок
c = 2 # индекс дефолтного элемента списка, т.е. пустого
# choise = choise_list[c] # <-----
def setfunction(choise): # функция показывает три картинки
stimnames=['mc','mo','msf'] # список имён картинок
setting={} # здесь будут пути к картинкам
ext='.png'
mypath='./'
win = visual.Window(fullscr=True, size=(1920,1080), color=(backcolor,backcolor,backcolor), colorSpace='rgb255')
cross=visual.TextStim(win,text='+',pos=(0.0,0.0))
for pic in stimnames:
setting[pic] = visual.ImageStim(win,mypath+pic+choise+ext) # заполняет словарь с путями к картинкам
setting['mc'].pos=(-0.5,0)
setting['mc'].draw(win)
setting['mo'].pos=(0.5,0.5)
setting['mo'].draw(win)
setting['msf'].pos=(0.5,-0.5)
setting['msf'].draw(win)
cross.draw(win)
win.flip() # эти строчки показывают собственно картинку
setfunction(choise)
key_f=event.waitKeys(keyList=['left', 'right', 'escape', 'enter'])
if key_f[0] == ['left']:
c -= 1
setfunction(choise_list[c]) # <-----
elif key_f[0] == ['right']:
c += 1
setfunction(choise_list[c]) # <-----
elif key_f[0] == ['enter']:
display_text_msg("Вашей задачей будет"+"\n"+"qwe qwe qwe"+"\n"+"re re rer")
Однако, если пользователь "потыкает вправо", то программа выдаст ошибку IndexError. Чтобы этого избежать нужно c после добавления единицы проверять на выход из диапазона, и делать одно из двух:
- Начинать список слева (вроде бесконечного повторяющегося списка
[1, 2, 3, 1, 2, 3, ...]) -c = (c+1)%len(choice_list) - Не менять
c-c += 1 if c < len(choice_list) else 0