【问题标题】:Python TypeError: 'NoneType' object has no attribute '__getitem__'Python TypeError:“NoneType”对象没有属性“__getitem__”
【发布时间】:2017-05-28 05:24:14
【问题描述】:

我不太确定这里发生了什么。当来自我的网络摄像头的提要的最暗部分位于显示器的特定位置时,我试图让它播放声音。当我运行它时,我得到了这个错误

文件“/home/phur/Documents/052617/052617.py”,第 42 行,钢琴 如果 par[100, 200] == surface.map_rgb((0, 0, 0)): TypeError:“NoneType”对象没有属性“getitem” (0, 0)

这是我的代码:

import pygame
import pygame.camera
from pygame.locals import *
import time
import random
import Image

pygame.init()
pygame.camera.init()


size = (640, 480)

md = pygame.display.set_mode(size, 0)
pygame.display.set_caption("Piano")


def piano():

    stop_playing = False

    camera = pygame.camera.Camera('/dev/video0', size)
    camera.start()

    while not stop_playing:

        captured = camera.get_image(md)
        md.blit(captured, (0, 0))
        pygame.display.flip()

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                stop_playing = True

        mp = pygame.mouse.get_pos()
        par = pygame.PixelArray.surface.__init__()

        print mp

        for x in range(0, 213):
            for y in range(0, 240):
                if par[x, y] == pygame.surface.map_rgb((0, 0, 0)):
                    pygame.mixer.music.load("C1.wav")
                    pygame.mixer.music.play()
                    time.sleep(1)
        for x in range(214, 426):
            for y in range(0, 240):
                if par[x, y] == pygame.surface.map_rgb((0, 0, 0)):
                    pygame.mixer.music.load("D1.wav")
                    pygame.mixer.music.play()
                    time.sleep(1)
        for x in range(427, 640):
            for y in range(0, 240):
                if par[x, y] == pygame.surface.map_rgb((0, 0, 0)):
                    pygame.mixer.music.load("E1.wav")
                    pygame.mixer.music.play()
                    time.sleep(1)
        for x in range(0, 320):
            for y in range(241, 480):
                if par[x, y] == pygame.surface.map_rgb((0, 0, 0)):
                    pygame.mixer.music.load("F1.wav")
                    pygame.mixer.music.play()
                    time.sleep(1)
        for x in range(321, 640):
            for y in range(241, 480):
                if par[x, y] == pygame.surface.map_rgb((0, 0, 0)):
                    pygame.mixer.music.load("G1.wav")
                    pygame.mixer.music.play()
                    time.sleep(1)

piano()
quit()

【问题讨论】:

  • 欢迎来到 Stackoverflow!在询问有关代码错误的问题时,您应该始终创建一个minimal reproducible example。通过这样做,您可以使问题更容易理解,更容易给出很好的答案,对未来的读者更有价值,在大多数情况下,您甚至可能在此过程中自己发现错误。要创建minimal reproducible example,您首先需要删除冗余代码。错误出现在第一个 for 循环中,因此该问题不需要剩余的 3 个循环。设置标题和打印鼠标位置之类的小东西也可以删除。完整且可验证的部分很好
  • 只是为了演示; here 是一个关于如何最小化代码的示例(我还提供了一些其他有用的 cmets,但它们不应该出现在实际问题中)。

标签: python pygame


【解决方案1】:

您似乎没有正确初始化您的pygame.PixelArray

根据pygame pixel array doc example。首先,您应该创建一个表面或屏幕供 python 显示。

size = (640, 480)
md = pygame.display.set_mode(size, 0)
surface = pygame.Surface(size)

接下来,在您的 piano() 函数中:

# create pixel array
par = pygame.PixelArray(surface)

一般来说,您不应该使用双前导和双尾下划线函数。在这种情况下,您的行 par = pygame.PixelArray.surface.__init__() 是可疑的。 如果你好奇,这里有一个很好的解释 why some functions have underscores in python

【讨论】:

  • Surface 是一个类所以它应该是pygame.Surface(size)
  • 谢谢,已修复!
猜你喜欢
  • 2018-04-13
  • 2013-04-15
  • 2017-01-08
  • 2017-08-17
  • 2012-12-04
  • 2014-07-03
  • 1970-01-01
  • 2014-08-14
相关资源
最近更新 更多