鱼C论坛

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

代码报错“TypeError: 'method' object is not iterable”,python小白求助!

[复制链接]
发表于 2019-8-19 09:06:32 | 显示全部楼层 |阅读模式

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

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

x
最近看关于pygame的有关视频,然后就出现了方法不可迭代的错误
        以下是出现错误的地方
        return [i for i in self.grid.grid_list if i not in self.body[2:]]
请问各位大牛和各位前辈怎么修改。
我甚至不明白为什么要“2: ”
所以各位前辈,拜托了!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-8-19 09:07:13 | 显示全部楼层
把整段代码贴出来
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-19 09:11:43 | 显示全部楼层
本帖最后由 Disguiser 于 2019-8-19 09:13 编辑
zltzlt 发表于 2019-8-19 09:07
把整段代码贴出来


def available_grid(self):
        #获得能用的坐标
        return [i for i in self.grid.grid_list if i not in self.body[2:]]

C:\Users\0\Pictures\Camera Roll\dat.png就只创建了一个方法,里面就只有这一句话,该怎么办啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-19 09:15:28 | 显示全部楼层
Disguiser 发表于 2019-8-19 09:11
def available_grid(self):
        #获得能用的坐标
        return ]

图片没显示,我的意思是把整个程序的代码贴出来
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-19 09:15:34 | 显示全部楼层
zltzlt 发表于 2019-8-19 09:07
把整段代码贴出来

import sys
import random
from tkinter import  *


class Grid(object):
    def __init__(self,master = None,window_width = 500,window_height = 400,grid_width = 20,offset = 10):
                    #设置窗口参数        grid是表格的意思,以下就是表格布局的宽度--offset是偏移量的意思
        self.height = window_height
        self.width = window_width
        self.grid_width = grid_width
        self.offset = offset
        self.grid_x = (self.width / self.grid_width)
        self.grid_y = (self.height / self.grid_width)
        self.bg = 'black'
        self.canvas = Canvas(master,width = self.width+2*self.offset,height = self.height+2*offset,bg = self.bg)
        self.canvas.pack()
    #方块的位置
    def draw(self,pos,color):
        x = pos[0] * self.grid_width+self.offset
        y = pos[1] * self.grid_width+self.offset
        self.canvas.create_rectangle(x,y,x+self.grid_width,y+self.width+self.offset,fill = color,outline = self.bg)

    def grid_list(self):
        #获取坐标
        grid_list = []
        for y in range(0,self.grid_y):
            for x in range(0,self.grid_x):
                grid_list.append(x,y)
        self.grid_list = grid_list


class Food(object):
    def __init__(self,Grid):
        self.grid = Grid
        self.color = '#23d978'
        self.set_pos()

    def set_pos(self):
        x = random.randint(0,self.grid.grid_x -1)
        y = random.randint(0,self.grid.grid_y -1)
        self.pos = (x,y)

    #显示方块
    def display(self):
        self.grid.draw(self.pos,self.color)



class Snake(object):
    def __init__(self,Grid):
        self.grid = Grid
        self.body = [(10,6),(10,7),(10,8)]
        self.direction = 'Up'#方向
        #暂停和继续
        self.status = ['run','stop']
        #运行速度
        self.speed = 1000
        self.color = 'red'
        self.food = Food(self.grid)
        self.gameover = False
        #分数
        self.scoer = 0

    def available_grid(self):
        #获得能用的坐标
        return [i for i in self.grid.grid_list if i not in self.body[2:]]
    def gaibian(self,direction):
        #改变方向
        self.direction = direction
    def display(self):
        #显示位置
        for(x,y) in self.body:
            self.grid.draw((x,y),self.color)

    def display_food(self):
        #判断位置
        while self.food.pos in self.body:
            self.food.set_pos()
        self.food.display()
    def move(self):
        #移动位置
        head = self.body[0]
        if self.direction == 'Up':
            new = (head[0],head[1] -1)
        elif self.direction =='Down':
            new = (head[0],head[1]+1)
        elif self.direction == 'Left':
            new = (head[0]-1,head[1])
        else:
            new = (head[0]+1)


        if not self.food.pos == head:
            pop = self.body.pop()
            self.grid.draw(pop,self.grid.bg)
        else:
            self.display_food()#生成新的
            self.scoer +=1

        self.body.insert(0,new)

        if not new in self.available_grid():
            #如果新的坐标不在可以出现的位置,就结束
            self.status.reverse()
            self.gameover = True
        else:
            self.grid.draw(new,color = self.color)#显示新坐标

''''''
class SankeGame(Frame):
    #接收字典和接收元组
    def __init__(self,master = None,*args,**kwargs):
        Frame.__init__(self,master)
        self.grid = Grid(master = master,*args,**kwargs)
        self.snake = Snake(self.grid)
        self.bind_all('<KeyRelease>',self.key_release)

    def run(self):
        if not self.snake.status[0] == 'stop':
            self.snake.move()
        if self.snake.gameover == True:
            sys.exit()
        self.after(self.snake.speed,self.run)

    def key_release(self,event):
        key = event.keysym
        key_dict = {'Up':'Down','Down':'Up','Left':'Right','Right':'Left'}

        if key_dict.has_key(key) and not key == key_dict[self.snake.direction]:
            self.snake.change_direction(key)
            self.snake.move()




if __name__ == '__main__':
    root = Tk()
    root.title('My Game!')
    snakegame = SankeGame(root)
    snakegame.run()
    snakegame.mainloop()

这是整个项目。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-19 09:24:59 | 显示全部楼层
你的方法和属性列表重名了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-19 09:29:14 | 显示全部楼层
塔利班 发表于 2019-8-19 09:24
你的方法和属性列表重名了

可是程序报错说我那个for不可以迭代,我改过那个重名,emm。没用
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-19 09:45:17 | 显示全部楼层
你先这么改吧,好像还有N多问题,自己看看
  1. import sys
  2. import random
  3. from tkinter import  *


  4. class Grid(object):
  5.     def __init__(self,master = None,window_width = 500,window_height = 400,grid_width = 20,offset = 10):
  6.                     #设置窗口参数        grid是表格的意思,以下就是表格布局的宽度--offset是偏移量的意思
  7.         self.height = window_height
  8.         self.width = window_width
  9.         self.grid_width = grid_width
  10.         self.offset = offset
  11.         self.grid_x = (self.width / self.grid_width)
  12.         self.grid_y = (self.height / self.grid_width)
  13.         self.bg = 'black'
  14.         self.canvas = Canvas(master,width = self.width+2*self.offset,height = self.height+2*offset,bg = self.bg)
  15.         self.canvas.pack()
  16.     #方块的位置
  17.     def draw(self,pos,color):
  18.         x = pos[0] * self.grid_width+self.offset
  19.         y = pos[1] * self.grid_width+self.offset
  20.         self.canvas.create_rectangle(x,y,x+self.grid_width,y+self.width+self.offset,fill = color,outline = self.bg)

  21.     def grid_list(self):
  22.         #获取坐标
  23.         grid_list = []
  24.         for y in range(0,self.grid_y):
  25.             for x in range(0,self.grid_x):
  26.                 grid_list.append(x,y)
  27.         return grid_list


  28. class Food(object):
  29.     def __init__(self,Grid):
  30.         self.grid = Grid
  31.         self.color = '#23d978'
  32.         self.set_pos()

  33.     def set_pos(self):
  34.         x = random.randint(0,self.grid.grid_x -1)
  35.         y = random.randint(0,self.grid.grid_y -1)
  36.         self.pos = (x,y)

  37.     #显示方块
  38.     def display(self):
  39.         self.grid.draw(self.pos,self.color)



  40. class Snake(object):
  41.     def __init__(self,Grid):
  42.         self.grid = Grid
  43.         self.body = [(10,6),(10,7),(10,8)]
  44.         self.direction = 'Up'#方向
  45.         #暂停和继续
  46.         self.status = ['run','stop']
  47.         #运行速度
  48.         self.speed = 1000
  49.         self.color = 'red'
  50.         self.food = Food(self.grid)
  51.         self.gameover = False
  52.         #分数
  53.         self.scoer = 0

  54.     def available_grid(self):
  55.         #获得能用的坐标
  56.         return [i for i in self.grid.grid_list() if i not in self.body[2:]]
  57.     def gaibian(self,direction):
  58.         #改变方向
  59.         self.direction = direction
  60.     def display(self):
  61.         #显示位置
  62.         for(x,y) in self.body:
  63.             self.grid.draw((x,y),self.color)

  64.     def display_food(self):
  65.         #判断位置
  66.         while self.food.pos in self.body:
  67.             self.food.set_pos()
  68.         self.food.display()
  69.     def move(self):
  70.         #移动位置
  71.         head = self.body[0]
  72.         if self.direction == 'Up':
  73.             new = (head[0],head[1] -1)
  74.         elif self.direction =='Down':
  75.             new = (head[0],head[1]+1)
  76.         elif self.direction == 'Left':
  77.             new = (head[0]-1,head[1])
  78.         else:
  79.             new = (head[0]+1)


  80.         if not self.food.pos == head:
  81.             pop = self.body.pop()
  82.             self.grid.draw(pop,self.grid.bg)
  83.         else:
  84.             self.display_food()#生成新的
  85.             self.scoer +=1

  86.         self.body.insert(0,new)

  87.         if not new in self.available_grid():
  88.             #如果新的坐标不在可以出现的位置,就结束
  89.             self.status.reverse()
  90.             self.gameover = True
  91.         else:
  92.             self.grid.draw(new,color = self.color)#显示新坐标

  93. ''''''
  94. class SankeGame(Frame):
  95.     #接收字典和接收元组
  96.     def __init__(self,master = None,*args,**kwargs):
  97.         Frame.__init__(self,master)
  98.         self.grid = Grid(master = master,*args,**kwargs)
  99.         self.snake = Snake(self.grid)
  100.         self.bind_all('<KeyRelease>',self.key_release)

  101.     def run(self):
  102.         if not self.snake.status[0] == 'stop':
  103.             self.snake.move()
  104.         if self.snake.gameover == True:
  105.             sys.exit()
  106.         self.after(self.snake.speed,self.run)

  107.     def key_release(self,event):
  108.         key = event.keysym
  109.         key_dict = {'Up':'Down','Down':'Up','Left':'Right','Right':'Left'}

  110.         if key_dict.has_key(key) and not key == key_dict[self.snake.direction]:
  111.             self.snake.change_direction(key)
  112.             self.snake.move()




  113. if __name__ == '__main__':
  114.     root = Tk()
  115.     root.title('My Game!')
  116.     snakegame = SankeGame(root)
  117.     snakegame.run()
  118.     snakegame.mainloop()

复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-19 10:12:56 | 显示全部楼层
在哪看的pygame视频?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-19 10:13:27 | 显示全部楼层
bigplumtree 发表于 2019-8-19 10:12
在哪看的pygame视频?

我在b站看的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-19 10:14:08 | 显示全部楼层
zltzlt 发表于 2019-8-19 09:15
图片没显示,我的意思是把整个程序的代码贴出来

前辈,没看完吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-19 10:15:21 | 显示全部楼层
Disguiser 发表于 2019-8-19 10:14
前辈,没看完吗?

好复杂。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-19 14:41:26 | 显示全部楼层

解决不了吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-19 15:00:28 | 显示全部楼层

这段代码大概错误就是因为这个语法不是这样写的,本意是想循环遍历出可以用的坐标,但是我现在不知道判断条件是什么~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-17 19:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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