【问题标题】:Python/Psychopy: Instantiating multiple circle objects from a classPython/Psychopy:从一个类中实例化多个圆形对象
【发布时间】:2017-06-06 01:21:24
【问题描述】:

我创建了一个包含一个圆圈(一个 Psychopy Circle 对象)的类。我想知道如何使用此类实例化 2 个圆形对象,例如,每个对象都具有不同的填充颜色。

class Circle(object):
    def __init__(self):
        self.circle = visual.Circle(win, units = 'deg', pos=(1,1), 
        radius=1, lineColor="black", fillColor="red")

        self.components = [self.circle]

    def draw(self):
        [component.draw() for component in self.components]

circle=Circle() #red colour
circle2=Circle() #blue colour if possible

有没有办法让我在访问一些 visual.circle 参数时实例化 circle2,例如改变它的位置或填充颜色?这是我第一次使用类。目前,如果我在屏幕上绘制 'circle' 和 'cirle2',一个只是覆盖另一个,因为一个只是另一个的副本。

干杯, 乔恩

【问题讨论】:

  • 目前还不清楚您要在这里实现什么。通常,您将继承 psychopy.visual.Circle 的子类以继承所有功能。我不明白这个列表的含义,因为无论如何你只在你的类中实例化一个psychopy.visual.Circle。我假设您只是想使用 psychopy.visual.Circle 对象列表?
  • 是的,我想创建一个psychopy.visual.Circle 对象列表,但让它们具有不同的颜色。

标签: python class psychopy


【解决方案1】:

根据您在评论中的说明,我假设您想要这样的东西:

class Circle(psychopy.visual.circle.Circle):
    def __init__(self, win, lineColor='black', fillColor='red'):
        super(Circle, self).__init__(
            win=win, lineColor=lineColor, fillColor=fillColor, units='deg',
            pos=(1,1), radius=1)

Circle 将默认为units='deg'pos=(1,1)radius=1。但是,您可以为每个实例指定不同的 lineColors 和 fillColors。由于Circle 继承自 PsychoPy visual.Circle 类,因此它具有所有功能。对super() 的调用实际上初始化了父类。参见例如this post 了解更多关于 super() 函数的信息。

让我们开始工作吧。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from psychopy import core, visual, monitors
import psychopy.visual.circle


class Circle(psychopy.visual.circle.Circle):
    def __init__(self, win, lineColor='black', fillColor='red'):
        super(Circle, self).__init__(
            win=win, lineColor=lineColor, fillColor=fillColor, units='deg',
            pos=(1,1), radius=1)


def main():
    # Create a temporary monitor configuration.
    monitor = monitors.Monitor('test_display')
    monitor.setWidth(60)
    monitor.setDistance(80)
    monitor.setSizePix((1440, 900))

    win = visual.Window(monitor=monitor)

    colors = ('red', 'green', 'blue')
    circles = [Circle(win=win, fillColor=color) for color in colors]

    for circle in circles:
        circle.draw()
        win.flip()
        core.wait(1)

    core.quit()


if __name__ == '__main__':
    main()

此代码将创建三个不同颜色的Circles,并一个接一个地显示它们。我必须创建一个临时监视器配置,否则 PsychoPy 会拒绝在我当前的计算机上打开 Window

【讨论】:

    【解决方案2】:

    您可以更改类的构造函数(__init__ 方法)添加属性color 并在fillColor 中将值更改为变量color。有了这个职位,你也可以这样做。

    【讨论】:

    • 那是什么样的?我在'self.circle..'下面尝试了'self.color = color',但我得到'全局名称'color'未定义'
    • 代码如下: class Circle(object): def __init__(self, color, posx, posy): self.circle = visual.Circle(win, units = 'deg', pos=( posx,posy), radius=1, lineColor="black", fillColor=color) self.components = [self.circle] def draw(self): [component.draw() for component in self.components] circle=Circle ('red', 1, 1) #red color at position (1, 1) circle2=Circle('blue', 2, 1) #blue color at position (2, 1)
    猜你喜欢
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多