鱼C论坛

 找回密码
 立即注册
查看: 1798|回复: 13

[已解决]pygame报错——TypeError:'bool' object is not callable

[复制链接]
发表于 2020-4-19 20:16:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这是为什么?
如果搞不明白的的话:
代码:
  1. import modules
  2. from pygame.locals import *

  3. def main():
  4.     modules.pygame.mixer.init()
  5.     modules.pygame.init()

  6.     x1 = ((modules.win32api.GetSystemMetrics(modules.win32con.SM_CXSCREEN)) // 2) - 1024 // 2
  7.     y1 = ((modules.win32api.GetSystemMetrics(modules.win32con.SM_CYSCREEN)) // 2) - 768 // 2
  8.     modules.os.environ['SDL_VIDEO_WINDOW_POS'] = "%d,%d" % (x1,y1)
  9.     del x1
  10.     del y1

  11.     #图片存放路径
  12.     image = str('..\\image\\')
  13.     #加载各类图片
  14.     bg_images = str(image) + 'bg.png'
  15.     ban_images = image + 'ban.png'
  16.     blue_block_images = image + 'blue_block.png'
  17.     ji_images = image + 'ji.png'
  18.     hand_image = image + 'hand.cur'
  19.     icon_image = image + 'elsfk.ico'

  20.     #按照背景图片大小设置窗口大小
  21.     bg_size = width, height = 1024, 768

  22.     screen = modules.pygame.display.set_mode(bg_size)

  23.     icon = modules.pygame.image.load(icon_image).convert_alpha()
  24.     cur = modules.pygame.image.load(hand_image).convert_alpha()
  25.     modules.pygame.display.set_icon(icon)
  26.     #设置标题栏文本

  27.     modules.pygame.display.set_caption("俄罗斯方块")


  28.     #用白色填充背景,避免出现一些奇奇怪怪的渲染问题

  29.     screen.fill((255,255,255))

  30.     background = modules.pygame.image.load(bg_images).convert_alpha()

  31.     clock = modules.pygame.time.Clock()
  32.     #用于存放消息列表
  33.     msg = []
  34.     #用于存放俄罗斯方块
  35.     blocks = []
  36.     group = modules.pygame.sprite.Group()
  37.     GAMEOVER = modules.USEREVENT
  38.     GAMEPAUSE = modules.USEREVENT

  39.     running = True

  40.     if running == False:
  41.         try:
  42.             sys.exit()
  43.         except SystemExit:
  44.             pass
  45.         except:
  46.             print("出错了!")
  47.         return 0
  48.     for i in range(1):
  49.       postion = (modules.random.randint(0, width), modules.random.randint(int(-20),int(0)))
  50.       speed = [0,0]
  51.       classes = modules.classes.Block(blue_block_images,postion,speed,bg_size)
  52.       block = modules.block.Block(classes.blue_image,classes.postion,\
  53.           classes.speed,classes.bg_size)

  54.       del classes

  55.       blocks.append(block)
  56.       group.add(block)
  57.       del block
  58.       modules.pygame.display.update()
  59.       modules.pygame.display.flip()
  60.       modules.pygame.key.set_repeat(100, 100)
  61.       modules.pygame.mouse.set_pos(500,450)
  62.       bools = True
  63.     while running:
  64.         for event in modules.pygame.event.get():
  65.             if event.type == modules.pygame.QUIT:
  66.                 running = False
  67.                 modules.pygame.quit()
  68.                 try:
  69.                    modules.sys.exit()
  70.                 except SystemExit:
  71.                     pass
  72.                 except:
  73.                     print("出错了!")
  74.                 return 0
  75.             elif event.type == GAMEOVER:
  76.                 running = False
  77.                 continue
  78.          
  79.             elif event.type == modules.KEYDOWN:
  80.                 if event.key == modules.K_d:
  81.                     for each in group:
  82.                         each.speed[0] = 1
  83.                 elif event.key == modules.K_a:
  84.                     for each in group:
  85.                         each.speed[0] = -1
  86.                 elif event.key == modules.K_s:
  87.                     blocks[0].down = True
  88.                     blocks[0].speed[1] = 2
  89.                 elif event.key == modules.K_RCTRL:
  90.                     bools = not(bools)

  91.             elif event.type == modules.KEYUP:
  92.                 if event.key == modules.K_s:
  93.                     blocks[0].down = False
  94.                     blocks[0].speed[1] = 0

  95.                 elif event.key == modules.K_d:
  96.                     for each in group:
  97.                         each.speed[0] = 0
  98.                 elif event.key == modules.K_a:
  99.                     for each in group:
  100.                         each.speed[0] = 0
  101.             elif event.type == modules.MOUSEBUTTONDOWN:
  102.                  bools = True
  103.         x , y = modules.pygame.mouse.get_pos()
  104.         if bools:
  105.             if y >= 700:
  106.                 modules.pygame.mouse.set_pos(x,768)
  107.                 y = 700

  108.             elif y <= 0:
  109.                 modules.pygame.mouse.set_pos(x,0)
  110.                 y = 0
  111.             if x >= 1000:
  112.                 modules.pygame.mouse.set_pos(1024,y)
  113.                 x = 1000
  114.             elif x <= 0:
  115.                 modules.pygame.mouse.set_pos(0,y)
  116.                 x = 0

  117.         screen.blit(background, (0, 0))
  118.         #modules.pygame.display.flip()
  119.         for each in blocks:
  120.             each.move()
  121.             screen.blit(each.blue_image,each.rect)
  122.         modules.pygame.display.flip()
  123.         modules.pygame.display.update()
  124.         clock.tick(30)
  125.     else:
  126.         try:
  127.             modules.sys.exit()
  128.         except SystemExit:
  129.             pass
  130.         except:
  131.             print("出错了!")



  132. if __name__ == "__main__":
  133.     # 这样做的好处是双击打开时如果出现异常可以报告异常,而不是一闪而过!
  134.     try:
  135.         main()
  136.     except SystemExit:
  137.         pass
  138.     except:
  139.         modules.traceback.print_exc()
  140.         modules.pygame.quit()
  141.         input()

  142.     del modules
复制代码

不是模块的问题,这些地方好好的
最佳答案
2020-4-19 21:45:28
NZND 发表于 2020-4-19 21:33
我看了半天,move函数是列表自带的方法,但我也不知道怎么用。
我倒是试过把括号去掉,倒是不报错了,但 ...
  1.         self.move = False
  2.     def move(self):
复制代码

果真有问题,你有属性move和方法move,同名了,有冲突,外面调用的其实是属性move,所以会报错,你改掉其中一个名字,然后再试。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-4-19 20:17:26 | 显示全部楼层
modules 的内容是什么?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-19 20:19:21 | 显示全部楼层
zltzlt 发表于 2020-4-19 20:17
modules 的内容是什么?

是一些模块,一部分是我自己写的,要看看吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-19 20:26:00 | 显示全部楼层
把异常的堆栈信息贴一下吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-19 20:30:11 | 显示全部楼层
把完整报错信息发一下吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-19 20:32:59 | 显示全部楼层
报错翻译过来就是:布尔对象不能被调用。你的代码别人没有运行环境不可能调试,所以也不可能知道你的错误是哪一句出错,但是你的报错信息里面有,所以把完成的报错信息贴出来别人才有可能帮你找出问题所在。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-19 20:39:58 | 显示全部楼层
txxcat 发表于 2020-4-19 20:32
报错翻译过来就是:布尔对象不能被调用。你的代码别人没有运行环境不可能调试,所以也不可能知道你的错误是 ...

Traceback (most recent call last):
  File "D:\C++SDK\Solution1\elsfk\elsfk.pyw", line 160, in <module>
    main()
  File "D:\C++SDK\Solution1\elsfk\elsfk.pyw", line 142, in main
    each.move()
TypeError: 'bool' object is not callable
上面就是全部报错信息了,麻烦帮看一下,谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-19 21:20:18 | 显示全部楼层
NZND 发表于 2020-4-19 20:39
Traceback (most recent call last):
  File "D:\C++SDK\Solution1\elsfk\elsfk.pyw", line 160, in
  ...

还真要看看modules的内容了,关键是move是如何定义的?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-19 21:28:14 | 显示全部楼层
txxcat 发表于 2020-4-19 21:20
还真要看看modules的内容了,关键是move是如何定义的?

modules牵扯到了一堆其他模块,它的代码:
  1. import pygame                    #主要模块,用于进行事件侦测、显示窗口等
  2. from pygame.locals import *      #pygame模块的常量模块
  3. import sys               #关于系统,大部分时候用于退出
  4. import block             #用于生成方块
  5. import os                #用于获取屏幕分辨率并设置窗口位置
  6. import win32api          #与上一个同用
  7. import win32con          #与上一个同用
  8. import random            #随机数模块
  9. import new_random        #一个可以做两位伪随机数的模块
  10. import classes           #一些乱七八糟的类
  11. import content           #存放着一些暂时不用的变量和模块
  12. import ji                #对于计分板生成的模块
  13. import traceback         #用于保证如果出错了,不会一闪而过
复制代码

ji、content、new_random这些模块暂时没用,所以就先不发代码了
一下是block模块的内容:
  1. from modules import pygame
  2. import random

  3. class Block(pygame.sprite.Sprite):
  4.     def __init__(self,blue_image,postion,speed,bg_size):
  5.         pygame.sprite.Sprite.__init__(self)
  6.         self.blue_image = pygame.image.load(blue_image).convert_alpha()
  7.         self.postion = postion
  8.         self.rect = self.blue_image.get_rect()
  9.         self.rect.left,self.rect.top = postion
  10.         self.down = False
  11.         self.speed = speed
  12.         self.bg_size = bg_size
  13.         self.width , self.height = bg_size
  14.         pygame.display.flip()
  15.         pygame.display.update()
  16.         self.move = False
  17.     def move(self):
  18.         if self.down:
  19.             self.rect = self.rect.move(0,self.speed[1])
  20.         elif self.move:
  21.             self.rect = self.rect.move(self.speed[0],0)

  22.         if self.rect.right <= 0:
  23.             self.rect.left = self.width

  24.         elif self.rect.left >= self.width:
  25.             self.rect.right = 0

  26.         elif self.rect.bottom <= 0:
  27.             self.rect.top = self.height
复制代码

以下是classes的内容:
  1. class Block():
  2.     def __init__(self,blue_image,postion,speed,bg_size):
  3.         self.postion = postion
  4.         self.speed = speed
  5.         self.blue_image = blue_image
  6.         self.bg_size = bg_size
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-19 21:30:21 | 显示全部楼层
txxcat 发表于 2020-4-19 21:20
还真要看看modules的内容了,关键是move是如何定义的?

move说实话,我也不知道是怎么写的,反正跟着小甲鱼老师敲敲敲,然后又改,有些地方我还是很懵............T_T
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-19 21:33:18 | 显示全部楼层
txxcat 发表于 2020-4-19 21:20
还真要看看modules的内容了,关键是move是如何定义的?

我看了半天,move函数是列表自带的方法,但我也不知道怎么用。
我倒是试过把括号去掉,倒是不报错了,但是程序也不响应事件了……
我太难了!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-19 21:44:49 | 显示全部楼层
        self.move = False
    def move(self):

这个属性名和方法名冲突了,把其中一个改下名吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-19 21:45:28 | 显示全部楼层    本楼为最佳答案   
NZND 发表于 2020-4-19 21:33
我看了半天,move函数是列表自带的方法,但我也不知道怎么用。
我倒是试过把括号去掉,倒是不报错了,但 ...
  1.         self.move = False
  2.     def move(self):
复制代码

果真有问题,你有属性move和方法move,同名了,有冲突,外面调用的其实是属性move,所以会报错,你改掉其中一个名字,然后再试。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-19 21:54:13 | 显示全部楼层
zltzlt 发表于 2020-4-19 21:44
self.move = False
    def move(self):

@txxcat @zltzlt 感谢!可是我应该设谁是最佳答案呢?这样,你俩看看谁先回复,最佳答案就给谁吧!不然我还真选不出最佳答案。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-17 17:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表