TypeError:'pygame.Surface'对象不可调用[Pygame模块]

时间:2017-08-26 16:24:52

标签: python python-3.x pygame

我最近一直在设计游戏,因为我正在学校开始上课 并认为获得成功会有所帮助。

我遇到了错误

Traceback (most recent call last):
  File "C:\Users\Jake\Documents\Dungeon Crawler 2.1\Main.py", line 100, in <module>
    town()    
  File "C:\Users\Jake\Documents\Dungeon Crawler 2.1\Main.py", line 85, in town
    houseSpr1(0,250)
TypeError: 'pygame.Surface' object is not callable

执行此代码时。

def town ():
    global outTown
    while not outTown:
            for event in pygame.event.get():
                    if event.type == pygame.MOUSEBUTTONDOWN:
                            print (event)
                            mx, my = pygame.mouse.get_pos()
                            mx = mx + my
                            if 375 <= mx <= 448:
                                    outTown = True
                                    print ("OK!")
                    if event.type == pygame.QUIT:
                            pygame.quit()
                            quit()

            houseSpr1 = pygame.image.load ('houseD.png') # default house img
            houseSpr1(0,250)
            gameDisplay.fill(green) # background
            pygame.draw.rect(gameDisplay,grey,(0,400,1280,50)) # main path
            pygame.draw.rect(gameDisplay,grey,(200,125,50,280)) # branch path
            player(x,y)
            pygame.display.update()
            clock.tick(60)

def houseSpr1(a,b):
    gameDisplay.blit(houseSpr1, (0,250))

def house1():
    global outHouse
    while not outHouse:
            gameDisplay.fill(black)
town()
houseSpr1()
gameIntro()
house1()
pygame.quit()
quit()

我理解这段代码在某些方面可能效率低下,如果您希望在这方面提供见解,我会很高兴知道如何改进它。

对此错误的任何帮助将不胜感激。是的,在我之前我已经阅读了其余的问题,我看到它主要是印刷错误,但我在这里看不到任何问题。

2 个答案:

答案 0 :(得分:2)

您使用名称houseSpr1进行了两件事:

  • 全局函数def houseSpr1(a,b): ...
  • 您加载的图片的本地变量:houseSpr1 = pygame.image.load ('houseD.png')

这两个名称不是独立的。函数只是Python中的另一种类型的对象,它们只是像任何其他变量一样存储。

当您使用表达式houseSpr1(0,250)时,Python将其视为:

  1. 加载名为houseSpr1
  2. 的对象
  3. 0250(两个整数对象)
  4. 获取结果
  5. 调用步骤1中加载的对象,传递步骤2的结果。
  6. 因为您在houseSpr1函数中为名称town()分配了一些内容,所以该对象,即加载的图像,Python试图调用。 PyGame使用名为Surface的对象类型来加载图像,错误告诉您尝试调用该对象,但该对象不支持被调用。

    解决方案是不使用相同的名称:

    houseSpr1Image = pygame.image.load('houseD.png')
    houseSpr1(0, 250)
    

    您还必须调整houseSpr1功能:

    def houseSpr1(a,b):
        gameDisplay.blit(houseSpr1Image, (0,250))
    

    你这里还有其他问题; houseSpr1Image不是全局的,因此houseSpr1()函数找不到它,会给您NameError例外。您还忽略了函数的ab参数,并在那里对0,250进行了硬编码。您必须解决这些问题才能使代码生效。也许你可以采用第三个参数image

    def houseSpr1(image, a, b):
        gameDisplay.blit(image, (a, b))
    

    并传入图像表面:

    houseSpr1Image = pygame.image.load('houseD.png')
    houseSpr1(houseSpr1Image, 0, 250)
    

答案 1 :(得分:0)

Martijn Pieters已经详细解释了为什么你的代码不起作用。这是一个简洁的程序版本,可以向您展示它应该是什么样子。

实际上,blit_houseSpr1函数不是必需的,因为您也可以在主循环中调用gameDisplay.blit(houseSpr1, (80, 250)),但我只是想演示如何使用函数并将一些参数传递给它

import pygame

pygame.init()
gameDisplay = pygame.display.set_mode((640, 480))
clock = pygame.time.Clock()

green = pygame.Color('green4')
grey = pygame.Color('grey50')
# Load the images once, because loading them from the hard disk is slow.
# And use the convert or convert_alpha methods to improve the performance.
houseSpr1 = pygame.image.load('houseD.png').convert()


def town():
    outTown = False
    while not outTown:
        for event in pygame.event.get():
            if event.type == pygame.MOUSEBUTTONDOWN:
                mx, my = pygame.mouse.get_pos()
                mx = mx + my
                if 375 <= mx <= 448:
                    outTown = True
            elif event.type == pygame.QUIT:
                outTown = True

        gameDisplay.fill(green) # background
        pygame.draw.rect(gameDisplay,grey,(0,400,1280,50)) # main path
        pygame.draw.rect(gameDisplay,grey,(200,125,50,280)) # branch path
        # Pass the image and the coordinates to the function.
        blit_houseSpr1(houseSpr1, 80, 250)

        pygame.display.update()
        clock.tick(60)


def blit_houseSpr1(image, a, b):
    # Now use the passed image and coordinates.
    gameDisplay.blit(image, (a, b))


town()
pygame.quit()