2017-02-19 11 views
0

Я прочитал документацию о id() этой работы, как этотPython - я не понимаю, это ID ситуацию

myvar='asd' 
print id(myvar) 

Но в этом коде я не могу понять, как это работает

from Tkinter import * 
import time 
import random 

class pelota: 
    def __init__(self,canvas,raqueta,color): 
     self.canvas=canvas 
     self.raqueta=raqueta 
     self.id=canvas.create_oval(10,10,25,25, fill=color) 
     self.canvas.move(self.id,250,125) 
     empezar=[-5,-4,-3,-2,-1,1,2,3,4,5] 
     random.shuffle(empezar) 
     self.x=empezar[0] 
     self.y=-3 
     self.canvas_height = self.canvas.winfo_height() 
     self.canvas_width = self.canvas.winfo_width() 

    def golpea_raqueta(self, pos): 
     raqueta_pos = self.canvas.coords(self.raqueta.id) 
     if pos[2] >= raqueta_pos[0] and pos[0] <= raqueta_pos[2]: 
      if pos[3] >=raqueta_pos[1] and pos[3] <= raqueta_pos[3]: 

Im говорить об этом конкретные линии

self.raqueta=raqueta 


    raqueta_pos = self.canvas.coords(self.raqueta.id) 

Как ID может работать (self.raqueta.id)?

ПОЛНЫЙ КОД

from Tkinter import * 
import time 
import random 

class pelota: 
    def __init__(self,canvas,raqueta,color): 
     self.canvas=canvas 
     self.raqueta=raqueta 
     self.id=canvas.create_oval(10,10,25,25, fill=color) 
     self.canvas.move(self.id,250,125) 
     empezar=[-5,-4,-3,-2,-1,1,2,3,4,5] 
     random.shuffle(empezar) 
     self.x=empezar[0] 
     self.y=-3 
     self.canvas_height = self.canvas.winfo_height() 
     self.canvas_width = self.canvas.winfo_width() 

    def golpea_raqueta(self, pos): 
     raqueta_pos = self.canvas.coords(self.raqueta.id) 
     if pos[2] >= raqueta_pos[0] and pos[0] <= raqueta_pos[2]: 
      if pos[3] >=raqueta_pos[1] and pos[3] <= raqueta_pos[3]: 
       return True 
     return False 

    def dibujar(self): 
     self.canvas.move(self.id,self.x,self.y) 
     pos = self.canvas.coords(self.id) 
     if pos[1]<=0: 
      self.y=3 
     if pos[0]<=0: 
      self.x=3 
     if pos[2]>= self.canvas_width : 
      self.x=-3 
     if self.golpea_raqueta(pos) == True: 
      self.y=-3 
     if pos[3] >= self.canvas_height : 
      self.y=-3 

class raqueta: 
    def __init__(self,canvas,color): 
     self.canvas=canvas 
     self.id=self.canvas.create_rectangle(10,10,100,20, fill=color) 
     self.canvas.move(self.id , 200,300) 
     self.x = 0 
     self.canvas_width = self.canvas.winfo_width() 
     self.canvas.bind_all('<KeyPress-Left>', self.izqu) 
     self.canvas.bind_all('<KeyPress-Right>', self.dere) 

    def dibujar(self): 
     self.canvas.move(self.id,self.x,0) 
     pos = self.canvas.coords(self.id) 
     if pos[0]<=0: 
      self.x=0 
     if pos[0]>0: 
      self.x=0 
     elif pos[2]>=self.canvas_width: 
      self.x=0 
    def izqu(self,evt): 
     self.x=-20 


    def dere(self,evt): 
     self.x=20 

vent= Tk() 
vent.title('mipong') 
vent.resizable(0,0) 
vent.wm_attributes('-topmost',1) 
canvas= Canvas(vent, width=500,height=500, bd=0,highlightthicknes=0) 
canvas.pack() 
vent.update() 

raqueta= raqueta(canvas,'blue')  
pelota=pelota(canvas,raqueta,'red') 


#help(Tkinter.Canvas.winfo_height) 
while 1: 
    pelota.dibujar() 
    raqueta.dibujar() 
    vent.update_idletasks() 
    vent.update() 
    time.sleep(0.01) 

ответ

1

При создании элемента на холсте, он возвращает уникальный идентификатор. В отправленном вами коде вы присваиваете идентификатор self.id. Хотя имя похоже на встроенную функцию с именем id, они полностью не связаны.

Чтобы избежать путаницы, вы можете переименовать self.id в self.canvas_id

+0

Я думаю, что то же самое, но ... когда я изменить имя с _id код не работает, однако я, наконец, исправить это, но я не понимаю, что линия , Другим функциональным вариантом было изменение (self.raqueta.id) на (реальный номер id) или создание var и сохранение там var = id (object). Можете ли попробовать, объясните, что я с полным кодом, потому что я не могу понять. – Shiki

+0

@Shiki: Я не знаю, как я могу сделать это яснее. Когда вы создаете овал, вы возвращаете идентификатор. Вы можете использовать этот идентификатор позже, чтобы изменить этот овал (или любой другой объект canvas). Он не имеет отношения к функции id. –

+0

да я понимаю, что, моя проблема в том, что это – Shiki