Написать код, который позволит пользователю пройтись по списку нажатиями стрелочек на клавиатуре

Пишу программу для психологического эксперимента. Суть в том, что пользователь сперва выбирает определенный набор картинок. Уже на этом этапе возникла проблема: в программировании новичок, поэтому не удивительно. Вот что я попытался сделать:

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 шт):

Автор решения: n1tr0xs

Изменяя переменную 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. Начинать список слева (вроде бесконечного повторяющегося списка [1, 2, 3, 1, 2, 3, ...]) - c = (c+1)%len(choice_list)
  2. Не менять c - c += 1 if c < len(choice_list) else 0
→ Ссылка