Меню в Glowscript и VPython

Для школьного проекта мы с другом сейчас пытаемся запрограммировать симуляцию нашей Солнечной системы. Мы используем платформу Glowscript и работаем с VPython. Мы уже запрограммировали всю нашу солнечную систему со всеми ее планетами, солнцем и силами между ними.

Сейчас мы пытаемся добавить некоторые дополнения, и одно из них — это меню, в котором пользователь может выбрать планету. В нашем коде выбранный объект (планета или солнце, определенные в коде) будет помечен как «текущий объект». После этого пользователь сможет изменить массу текущего объекта с помощью ползунка.

В процессе программирования возникли две проблемы. Первый заключается в том, что мы не смогли определить объект как текущий объект, чтобы впоследствии можно было изменить его массу. К сожалению, мы не смогли найти проблему в нашем коде.

Вторая проблема заключается в том, что мы не смогли добавить больше одного дополнения к нашей симуляции в Glowscript. Мы уже запрограммировали ползунок для изменения «скорости» симуляции, и после этого меню и ползунок для изменения массы просто не отображались.

def M(m):
    global col, currentobject
    currentobject.visible = True
    obj = m.selected
    if obj == 'Sun':
        currentobject = sun
    elif obj == "Mercury":
        currentobject = mercury
    elif obj == "Venus": 
        currentobject = venus
    elif obj == "Earth": 
        currentobject = earth
    elif obj == "Mars": 
        currentobject = mars
    elif obj == "Jupiter": 
        currentobject = jupiter
    elif obj == "Saturn": 
        currentobject = saturn
    elif obj == "Uranus": 
        currentobject = uranus
    elif obj == "Neptune": 
        currentobject = neptune
    currentobject=m.selected
    print(m.selected,m.index)


menu(choices=['Choose an object', 'Sun', 'Mercury', 'Venus', 'Earth', 'Mars', 'Jupiter', 'Saturn', 'Uranus', 'Neptune'], bind=M)
scene.append_to_caption('\n\n')


def setmass(b):
    wt.text = '{:1.2f}'.format(b.value)
sl = slider(min=0.1, max=10, value=0.1, length = 1000, bind=setmass)  
wt = wtext(text='{:1.2f}'.format(sl.value))


#mainloop 

while (True):  


    rate(10)

    currentobject.mass=currentobject.mass*sl.value

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

Сообщение об ошибке:

TypeError: невозможно прочитать свойство «масса» неопределенного


person Eva12345    schedule 20.08.2019    source источник


Ответы (1)


Фрагмент вашего кода недостаточно полон, чтобы точно понять, в чем проблема, но я отмечаю, что первый вызов M имеет значение currentobject.visible = True, но currentobject еще не существует, поэтому вы получаете сообщение об ошибке. Точно так же в вашем цикле вы ссылаетесь на currentobject.mass, но currentobject еще не существует.

person user1114907    schedule 26.08.2019