鱼C论坛

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

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

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

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

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

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

def main():
    modules.pygame.mixer.init()
    modules.pygame.init()

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

    #图片存放路径
    image = str('..\\image\\')
    #加载各类图片
    bg_images = str(image) + 'bg.png'
    ban_images = image + 'ban.png'
    blue_block_images = image + 'blue_block.png'
    ji_images = image + 'ji.png'
    hand_image = image + 'hand.cur'
    icon_image = image + 'elsfk.ico'

    #按照背景图片大小设置窗口大小
    bg_size = width, height = 1024, 768
 
    screen = modules.pygame.display.set_mode(bg_size)

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

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


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

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

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

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

    running = True

    if running == False:
        try:
            sys.exit()
        except SystemExit:
            pass
        except:
            print("出错了!")
        return 0
    for i in range(1):
      postion = (modules.random.randint(0, width), modules.random.randint(int(-20),int(0)))
      speed = [0,0]
      classes = modules.classes.Block(blue_block_images,postion,speed,bg_size)
      block = modules.block.Block(classes.blue_image,classes.postion,\
          classes.speed,classes.bg_size)

      del classes

      blocks.append(block)
      group.add(block)
      del block
      modules.pygame.display.update()
      modules.pygame.display.flip()
      modules.pygame.key.set_repeat(100, 100)
      modules.pygame.mouse.set_pos(500,450)
      bools = True
    while running:
        for event in modules.pygame.event.get():
            if event.type == modules.pygame.QUIT:
                running = False
                modules.pygame.quit()
                try:
                   modules.sys.exit()
                except SystemExit:
                    pass
                except:
                    print("出错了!")
                return 0
            elif event.type == GAMEOVER:
                running = False
                continue
         
            elif event.type == modules.KEYDOWN:
                if event.key == modules.K_d:
                    for each in group:
                        each.speed[0] = 1
                elif event.key == modules.K_a:
                    for each in group:
                        each.speed[0] = -1
                elif event.key == modules.K_s:
                    blocks[0].down = True
                    blocks[0].speed[1] = 2
                elif event.key == modules.K_RCTRL:
                    bools = not(bools)

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

                elif event.key == modules.K_d:
                    for each in group:
                        each.speed[0] = 0
                elif event.key == modules.K_a:
                    for each in group:
                        each.speed[0] = 0
            elif event.type == modules.MOUSEBUTTONDOWN:
                 bools = True
        x , y = modules.pygame.mouse.get_pos()
        if bools:
            if y >= 700:
                modules.pygame.mouse.set_pos(x,768)
                y = 700

            elif y <= 0:
                modules.pygame.mouse.set_pos(x,0)
                y = 0
            if x >= 1000:
                modules.pygame.mouse.set_pos(1024,y)
                x = 1000
            elif x <= 0:
                modules.pygame.mouse.set_pos(0,y)
                x = 0

        screen.blit(background, (0, 0))
        #modules.pygame.display.flip()
        for each in blocks:
            each.move()
            screen.blit(each.blue_image,each.rect)
        modules.pygame.display.flip()
        modules.pygame.display.update()
        clock.tick(30)
    else:
        try:
            modules.sys.exit()
        except SystemExit:
            pass
        except:
            print("出错了!")



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

    del modules
不是模块的问题,这些地方好好的
最佳答案
2020-4-19 21:45:28
NZND 发表于 2020-4-19 21:33
我看了半天,move函数是列表自带的方法,但我也不知道怎么用。
我倒是试过把括号去掉,倒是不报错了,但 ...
        self.move = False
    def move(self):
果真有问题,你有属性move和方法move,同名了,有冲突,外面调用的其实是属性move,所以会报错,你改掉其中一个名字,然后再试。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-19 20:17:26 | 显示全部楼层
modules 的内容是什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

是一些模块,一部分是我自己写的,要看看吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-19 20:26:00 | 显示全部楼层
把异常的堆栈信息贴一下吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-19 20:30:11 | 显示全部楼层
把完整报错信息发一下吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-19 20:32:59 | 显示全部楼层
报错翻译过来就是:布尔对象不能被调用。你的代码别人没有运行环境不可能调试,所以也不可能知道你的错误是哪一句出错,但是你的报错信息里面有,所以把完成的报错信息贴出来别人才有可能帮你找出问题所在。
想知道小甲鱼最近在做啥?请访问 -> 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
上面就是全部报错信息了,麻烦帮看一下,谢谢
想知道小甲鱼最近在做啥?请访问 -> 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是如何定义的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

class Block(pygame.sprite.Sprite):
    def __init__(self,blue_image,postion,speed,bg_size):
        pygame.sprite.Sprite.__init__(self)
        self.blue_image = pygame.image.load(blue_image).convert_alpha()
        self.postion = postion
        self.rect = self.blue_image.get_rect()
        self.rect.left,self.rect.top = postion
        self.down = False
        self.speed = speed
        self.bg_size = bg_size
        self.width , self.height = bg_size
        pygame.display.flip()
        pygame.display.update()
        self.move = False
    def move(self):
        if self.down:
            self.rect = self.rect.move(0,self.speed[1])
        elif self.move:
            self.rect = self.rect.move(self.speed[0],0)

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

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

        elif self.rect.bottom <= 0:
            self.rect.top = self.height
以下是classes的内容:
class Block():
    def __init__(self,blue_image,postion,speed,bg_size):
        self.postion = postion
        self.speed = speed
        self.blue_image = blue_image
        self.bg_size = bg_size
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

move说实话,我也不知道是怎么写的,反正跟着小甲鱼老师敲敲敲,然后又改,有些地方我还是很懵............T_T
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

这个属性名和方法名冲突了,把其中一个改下名吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-19 21:45:28 | 显示全部楼层    本楼为最佳答案   
NZND 发表于 2020-4-19 21:33
我看了半天,move函数是列表自带的方法,但我也不知道怎么用。
我倒是试过把括号去掉,倒是不报错了,但 ...
        self.move = False
    def move(self):
果真有问题,你有属性move和方法move,同名了,有冲突,外面调用的其实是属性move,所以会报错,你改掉其中一个名字,然后再试。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

@txxcat @zltzlt 感谢!可是我应该设谁是最佳答案呢?这样,你俩看看谁先回复,最佳答案就给谁吧!不然我还真选不出最佳答案。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-26 16:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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