如何使用 class 将文本绘制到 window?

How can I draw text to a window using a class?

我是 python 和 PsychoPy 的新手。我想画一个 window 并显示我的任务说明。如果按下 spacebar,则应该显示下一条指令。

我试过不使用 class 但我想坚持面向对象编程。

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()

用我的代码打开 window,当我点击 space 时,它再次关闭,但看不到任何文本。

我怀疑您的文字没有出现可能只是因为单位不一致。您已将文本刺激的单位定义为度数,但您根据以像素为单位的变量 winsize 计算其位置。我怀疑正在绘制刺激,但它在屏幕外很大(即 1536/4 deg 位于中心右侧,864/4 deg 位于中心上方)。

但在更高层次上,您可能希望在此处为您的 OOP 设计提供更多信息。例如,textstim class 的 initsettext 方法只是复制底层 TextStim class 的现有行为。因此,您可以将新的 show_until_spacebar 功能添加到 TextStim 并完成它,而无需所有这些开销。这两个 classes 实际上具有相同的名称这一事实表明存在一些重复(因此您被迫放弃使用首字母大写命名 classes 的约定, 以避免冲突)。

但无论如何,您可能需要考虑 show_until_spacebar() 功能是否属于单个刺激 class,或者更恰当地说,它应该作为功能添加到 Window class。

即如果您希望此功能存在于另一种刺激中,会发生什么情况?您是重复自己并向 class 添加相同的功能,还是创建它们都继承自的基础 superclass?但即使这样也是有限的。例如如果您希望此功能存在于具有多个刺激的 window 中,会发生什么情况?只在其中一个上调用函数似乎很麻烦。

这表明该函数可能应该位于 Window class 中。在那里,它只需要定义一次,它可以简单地循环绘制所有附加到它的刺激,并等待 space 条。这样一来,无论它只包含一个文本刺激还是许多其他刺激,它都能正常工作,然后您就有了一个更灵活的功能,可以在其他情况下使用。

祝您无论采取何种方式都好运:很高兴看到有人有意识地采用面向对象的方法来编写 PsychoPy 代码。它是为非程序员设计的,可以更容易地以简单的过程方式使用,但是面向对象的方法会导致您有更多的认知纪律,并希望代码更清晰、更易读。但是,如果确实需要事先进行大量的思考和准备:如果没有正确地概念化各种 classes 在实验过程中将如何相互作用,您最终可能会因为缺乏灵活性而陷入困境class 系统.