Как я могу нарисовать текст в окне, используя класс? - PullRequest
2 голосов
/ 19 сентября 2019

Я новичок в Python и PsychoPy.Я хочу нарисовать окно и показать мои инструкции для задачи.Если нажать пробел, то должна отобразиться следующая инструкция.

Я пробовал это без использования класса, но я хотел бы придерживаться объектно-ориентированного программирования.

from psychopy import visual, core, event
winsize=[1536, 864]
mywin = visual.Window(winsize, monitor='testMonitor', units='deg',allowGUI=False, winType='pyglet',fullscr=True, color = 'dimgrey',colorSpace ='rgb')


class textstim():
    def __init__(self, win, txt='Unicorn'):
        self.window = win
        self.text = visual.TextStim(win, text=txt, font=['Gill Sans MT', 'Arial','Helvetica','Verdana'], pos=[winsize[0]/4,winsize[1]/4], units='deg', alignHoriz='left', wrapWidth=winsize[0]/2, alignVert='top', height=1.0, color='gainsboro')

    def settext(self, txt):
        self.text.setText(text=txt)

    def show_until_spacebar(self):
        while True:
            self.text.draw()
            self.window.flip()
            if event.getKeys(['space']):
                break

welcome = textstim(mywin)
welcome.settext("Hello!\n\n"
                "Thank you for participating!")               
welcome.show_until_spacebar()

С моим кодомЯ открываю окно, и когда я нажимаю пробел, оно снова закрывается, но текст не виден.

1 Ответ

0 голосов
/ 20 сентября 2019

Я подозреваю, что неявка вашего текста может быть просто из-за несоответствия единиц.Вы определили единицы измерения для текстового стимула в градусах, но вы рассчитываете его положение на основе переменной winsize в пикселях.Я подозреваю, что стимул прорисовывается, но он в значительной степени за кадром (то есть что-то вроде 1536/4 deg справа от центра и 864/4 deg над центром).

Но на более высоком уровне вы можете захотетьдайте больше, хотя ваш дизайн ООП здесь.например, методы init и settext вашего класса textstim просто дублируют существующее поведение базового класса TextStim.Таким образом, вы можете просто добавить свою новую функциональность show_until_spacebar в TextStim и покончить с этим, без всяких дополнительных затрат.Тот факт, что два класса фактически имеют одно и то же имя, указывает на некоторое дублирование (и в результате вы были вынуждены отказаться от соглашения о присвоении имен классам с начальным капиталом, чтобы избежать конфликта).

Но независимо от этого вам, возможно, потребуется рассмотреть, относится ли функциональность show_until_spacebar() к отдельному классу стимулов, или, более правильно, ее следует добавить в качестве функции к классу Window.

то есть, что произойдет, если вы захотите, чтобы эта функциональность существовала для другого вида стимула?Вы повторяете себя и добавляете ту же функцию к этому классу, или вы создаете базовый суперкласс, от которого они оба наследуют?Но даже это ограничивает.Например, что произойдет, если вы хотите, чтобы эта функция существовала для окна с несколькими стимулами?Кажется грязным вызывать функцию только на одном из них.

Это означает, что функция, вероятно, должна находиться в классе Window.Там его нужно определить только один раз, и он может просто циклически перебирать все стимулы, приложенные к нему, и ждать пробела.Таким образом, он работает чисто, независимо от того, содержит ли он только один текстовый стимул или много других, и тогда у вас будет гораздо более гибкая функция, которую можно использовать в других ситуациях.

Удачи вам во всемМаршрут, по которому вы идете: приятно видеть, как кто-то сознательно применяет объектно-ориентированный подход к коду PsychoPy.Будучи разработанным для непрограммистов, он может быть легко использован простым процедурным способом, но объектно-ориентированный подход приводит к большей когнитивной дисциплине с вашей стороны и, как мы надеемся, намного более чистому и более читаемому коду.Но если для этого требуется немножко подумать и подготовиться заранее: если не правильно продумать, как различные классы будут взаимодействовать в ходе эксперимента, вы можете оказаться в тупике из-за негибкой системы классов.

...