Объект 'NoneType' не может быть вызван. питон

Я попытался написать небольшую игру для Raspberry Pi на Python (например, игру «Не-не»). Но я всегда получаю ошибку: 'Nonetype' Object is not callable, что на самом деле не имеет смысла? После экрана приветствия игра должна начаться с обратного отсчета, а затем на дисплее должен появиться случайный цвет. Если вы нажмете правильную кнопку, это должно дать вам более высокий балл и продолжать, пока он не достигнет 1000 баллов. Если вы нажмете неправильную кнопку, вы получите минус 100 баллов. Если счет достигает 0, игра должна закончиться.

Также я новичок в python. Спасибо за ваши ответы :).

Это ошибка:

Traceback (most recent call last):
  File "game.py", line 316, in <module>
    Menu()
  File "game.py", line 114, in Menu
    Start_Game()
  File "game.py", line 139, in Start_Game
    Random_Sequency()
  File "game.py", line 118, in Random_Sequency
    random.choice(Sequenzen)()
TypeError: 'NoneType' object is not callable

Это код:

import RPi.GPIO as GPIO
import time
import lcddriver 
import random

lcd = lcddriver.lcd()

lcd.lcd_clear()

#Welcome

lcd.lcd_display_string("   Welcome to", 1)
lcd.lcd_display_string("   Not-Not :)", 2) 

#End Welcome 

InputPin = 35 #Rot
InputPin2 = 32 #Blau
InputPin3 = 37 #Gruen
InputPin4 = 38 #Gelb 

OutputPin = 11 #Rot
OutputPin2 = 12 #Blau
OutputPin3 = 13 #Gruen
OutputPin4 = 15 #Gelb 

BuzzerPin = 40 #Buzzer 

WaitTime = 0.5 #Wartezeit 

#SETUP

GPIO.setmode(GPIO.BOARD)

GPIO.setup(InputPin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) #Input 1

GPIO.setup(InputPin2, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) #Input 2
GPIO.setup(InputPin3, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) #Input 3
GPIO.setup(InputPin4, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) #Input 4

GPIO.setup(OutputPin, GPIO.OUT) #Output 1

GPIO.setup(OutputPin2, GPIO.OUT) #Ouput 2
GPIO.setup(OutputPin3, GPIO.OUT) #Output 3
GPIO.setup(OutputPin4, GPIO.OUT) #Output 4 

#SETUP ENDE

#ENGINE

SCORE = 0

#Hauptmenue

def Menu(): 
    #Hauptmenue hier hin.
    Start_Game()
    #Hauptmenue Ende 

def Random_Sequency():
    random.choice(Sequenzen)()

#Spiel
def Start_Game():
    global SCORE

    lcd.lcd_clear()

    while(SCORE >= 0): 
        while(SCORE < 1000):

            lcd.lcd_display_string("Game starts in:", 1)
            lcd.lcd_display_string("3 Seconds.", 2)
            time.sleep(1)
            lcd.lcd_display_string("2 Seconds..", 2)
            time.sleep(1)
            lcd.lcd_display_string("1 Second...", 2)
            time.sleep(1)

            lcd.lcd_display_string("PRESS:", 1)

            Random_Sequency()

        lcd.lcd_display_string("Congratulations:", 1)
        lcd.lcd_display_string("YOU WON!", 2)
        time.sleep(5)
        SCORE = 0

        Menu() 



    lcd.lcd_display_string("    GAME", 1)
    lcd.lcd_display_string(" OVER :(", 2)
    time.sleep(5)
    SCORE = 0

    Menu()

#SEQUENZEN

#Blau
def Blue():
    global SCORE
    lcd.lcd_display_string("BLUE", 2)
    if (GPIO.input(InputPin2) == 1):
        lcd.lcd_display_string("<><><><><><><><>", 1)
        lcd.lcd_display_string("      :)", 2)
        print("Knopf BLAU gedrueckt!")
        GPIO.output(OutputPin2, 0)
        print("Richtig!")
        time.sleep(WaitTime)
        GPIO.output(OutputPin2, 1)
        SCORE = SCORE + 50
        Random_Sequency()
    elif ((GPIO.input(InputPin) == 1) or (GPIO.input(InputPin3) == 1) or (GPIO.input(InputPin4) == 1)):
        lcd.lcd_display_string("<><><><><><><><>", 1)
        lcd.lcd_display_string("      :(", 2)
        print("Falsch!")
        GPIO.output(OutputPin, 0)
        GPIO.output(OutputPin3, 0)
        GPIO.output(OutputPin4, 0)
        time.sleep(WaitTime)
        GPIO.output(OutputPin, 1)
        GPIO.output(OutputPin3, 1)
        GPIO.output(OutputPin4, 1)
        SCORE = SCORE - 100
        Random_Sequency()
#Blau Ende

#Rot
def Red():
    global SCORE
    lcd.lcd_display_string("RED", 2)
    if (GPIO.input(InputPin) == 1):
        lcd.lcd_display_string("<><><><><><><><>", 1)
        lcd.lcd_display_string("      :)", 2)
        print("Knopf ROT gedrueckt!")
        GPIO.output(OutputPin, 0)
        print("Richtig!")
        time.sleep(WaitTime)
        GPIO.output(OutputPin, 1)
        SCORE = SCORE + 50
        Random_Sequency()
    elif ((GPIO.input(InputPin2) == 1) or (GPIO.input(InputPin3) == 1) or (GPIO.input(InputPin4) == 1)):
        lcd.lcd_display_string("<><><><><><><><>", 1)
        lcd.lcd_display_string("      :(", 2)
        print("Falsch!")
        GPIO.output(OutputPin2, 0)
        GPIO.output(OutputPin3, 0)
        GPIO.output(OutputPin4, 0)
        time.sleep(WaitTime)
        GPIO.output(OutputPin2, 1)
        GPIO.output(OutputPin3, 1)
        GPIO.output(OutputPin4, 1)
        SCORE = SCORE - 100
        Random_Sequency()
#Rot Ende

#Gruen
def Green():
    global SCORE
    lcd.lcd_display_string("GREEN", 2)
    if (GPIO.input(InputPin3) == 1):
        lcd.lcd_display_string("<><><><><><><><>", 1)
        lcd.lcd_display_string("      :)", 2)
        print("Knopf GRUEN gedrueckt!")
        GPIO.output(OutputPin3, 0)
        print("Richtig!")
        time.sleep(WaitTime)
        GPIO.output(OutputPin3, 1)
        SCORE = SCORE + 50
        Random_Sequency()
    elif ((GPIO.input(InputPin) == 1) or (GPIO.input(InputPin2) == 1) or (GPIO.input(InputPin4) == 1)):
        lcd.lcd_display_string("<><><><><><><><>", 1)
        lcd.lcd_display_string("      :(", 2)
        print("Falsch!")
        GPIO.output(OutputPin, 0)
        GPIO.output(OutputPin2, 0)
        GPIO.output(OutputPin4, 0)
        time.sleep(WaitTime)
        GPIO.output(OutputPin, 1)
        GPIO.output(OutputPin2, 1)
        GPIO.output(OutputPin4, 1)
        SCORE = SCORE - 100
        Random_Sequency()
#Gruen Ende

#Gelb
def Yellow():
    global SCORE
    lcd.lcd_display_string("YELLOW", 2)
    if (GPIO.input(InputPin4) == 1):
        lcd.lcd_display_string("<><><><><><><><>", 1)
        lcd.lcd_display_string("      :)", 2)
        print("Knopf GELB gedrueckt!")
        GPIO.output(OutputPin4, 0)
        print("Richtig!")
        time.sleep(WaitTime)
        GPIO.output(OutputPin4, 1)
        SCORE = SCORE + 50
        Random_Sequency()
    elif (GPIO.input(InputPin) == 1 or GPIO.input(InputPin3) == 1 or GPIO.input(InputPin2) == 1):
        lcd.lcd_display_string("<><><><><><><><>", 1)
        lcd.lcd_display_string("      :(", 2)
        print("Falsch!")
        GPIO.output(OutputPin, 0)
        GPIO.output(OutputPin2, 0)
        GPIO.output(OutputPin3, 0)
        time.sleep(WaitTime)
        GPIO.output(OutputPin, 1)
        GPIO.output(OutputPin2, 1)
        GPIO.output(OutputPin3, 1)
        SCORE = SCORE - 100
        Random_Sequency()

Sequenzen = [Blue(), Red(), Green(), Yellow()]

#Inititation des Spieles 
try:
    while True:
        Menu()
except KeyboardInterrupt:
    GPIO.cleanup() 
#Initiation des Spieles Ende

#ENGINE ENDE

Что у вас есть в Sequenzen ? Если [None], то вы получаете None() в очереди random.choice(Sequenzen)()

furas 07.04.2019 21:12
Sequenzen = [Blue(), Red(), Green(), Yellow()] ваш список содержит кучу None, потому что все те функции, которые вы вызываете для их создания, возвращают None. Попробуйте print(Sequenzen). Непонятно, что именно вы пытаетесь сделать, но это ваша проблема.
juanpa.arrivillaga 07.04.2019 21:14

Вы опубликовали много кода. Попробуйте уменьшить его до минимальный воспроизводимый пример.

Bryan Oakley 07.04.2019 21:19
Sequenzen должен содержать несколько функций, которые должны вызываться случайным образом.
Pogo Peter 07.04.2019 21:21
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
1 320
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что когда вы делаете это:

Sequenzen = [Blue(), Red(), Green(), Yellow()]

вы вызываете эти функции здесь и сейчас, поэтому список содержит только их Результаты. Как было указано, ни одна из этих функций ничего не возвращает, поэтому все их результаты равны None, следовательно, ваша ошибка.

Что вы на самом деле хотите сделать, так это иметь список только самих функций:

Sequenzen = [Blue, Red, Green, Yellow]

Кроме того, функции, вероятно, должен что-то возвращают: а именно обновленную оценку, а не используют глобальную переменную.

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

Ошибки больше не появляются, но как можно вызвать случайную функцию и повторить этот процесс? Мой код всегда печатает обратный отсчет, 3...2...1..., а затем обратный отсчет повторяется. :/ Спасибо.

Pogo Peter 07.04.2019 21:48

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

Daniel Roseman 07.04.2019 21:52

(И, наконец, обратите внимание, что вам не нужно снова вызывать Random_Sequency в конце каждой функции; это уже делается, когда цикл while повторяется.)

Daniel Roseman 07.04.2019 21:53

Спасибо. Теперь все нормально :)!

Pogo Peter 08.04.2019 19:22

Другие вопросы по теме