ValueError: слишком много значений для распаковки, не могу понять вложенный цикл

Итак, я пытаюсь создать фрагмент кода, который возьмет изображение с зеленым экраном и поместит его на фон без зеленого экрана и будет прозрачным. Я делаю это для задания, поэтому не могу использовать функцию цветности или альфа-ключа. Я должен использовать вложенные циклы для подсчета каждого зеленого пикселя, и если он не зеленый, я не копирую его в фоновое изображение. Во всяком случае, это мой код.

for i in range(0, fy):
    for j in range(0, fx):
        (red,green,blue) = fg.get_at( (i,j) )
        if green == 255:
            green = 0
        else :
            fg.set_at( (i,j), (red,0,blue) )

        pygame.display.update() 

fx и fy объявлены ранее как размер изображения для изображения зеленого экрана переднего плана. Я получаю сообщение об ошибке:

Traceback (most recent call last):
  File "a6.py", line 60, in <module>
    (red,green,blue) = fg.get_at( (i,j) )
ValueError: too many values to unpack (expected 3)

кто-нибудь, пожалуйста, помогите мне


person Community    schedule 25.10.2017    source источник
comment
(красный, зеленый, синий) -> красный, зеленый, синий fg.get_at( (i,j) ) возвращает кортеж, вам нужно столько переменных, сколько элементов кортежа. Теперь у вас есть одна переменная слева (красная, зеленая, синяя).   -  person fafnir1990    schedule 25.10.2017
comment
Что такое get_at()? Какую именно версию python3 вы используете? Также, пожалуйста, исправьте отступ вашего кода.   -  person zezollo    schedule 25.10.2017
comment
Попробуйте отладить с помощью print, что возвращает fp.get_at   -  person Chen A.    schedule 25.10.2017
comment
Я предполагаю, что это может быть альфа-канал, который вы забыли распаковать: (red,green,blue,alpha) = fg.get_at( (i,j) )   -  person jadsq    schedule 25.10.2017


Ответы (2)


проблема заключалась в том, что мне пришлось написать код с подчеркиванием, например

(red,green,blue,_) = fg.get_at( (i,j) )
person Community    schedule 26.10.2017

Использовать

red, green, blue = fg.get_at( (i,j) )

вместо

(red,green,blue) = fg.get_at( (i,j) )
person Arunmozhi    schedule 25.10.2017
comment
Нет, это не имеет значения. Использование () не создает кортеж, это делают запятые. - person Dimitris Fasarakis Hilliard; 25.10.2017
comment
Оба синтаксиса одинаковы. Имена переменных, разделенных запятыми, рассматриваются как кортежи независимо от квадратных скобок. Проблема должна заключаться в том, что get_at может возвращать более 3 переменных. - person Sriram; 25.10.2017
comment
Так как я могу исправить это тогда? - person ; 26.10.2017