2017-02-19 28 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]: 

林談論這個具體行

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.idself.canvas_id

+0

我認爲同樣的事情,但...當我改名字與_id代碼不工作,但我終於解決它,但我不明白的是線。另一個功能選項是改變(self.raqueta.id)到(真正的id號)或者創建var並保存var = id(對象)謝謝。你可以嘗試用完整的代碼解釋我,因爲我無法理解。 – Shiki

+0

@Shiki:我不知道如何讓它更清晰。當你創建一個橢圓形時,你會得到一個標識符。您稍後可以使用該標識符來修改該橢圓形(或任何其他畫布對象)。它沒有與'id'功能相關。 –

+0

是的,我明白了,,我的問題是這 – Shiki