2016-12-28 97 views
1

我製作了這個模塊叫做gamesmodule,我正在研究一個讓畫面中的球產生並反彈的程序。我用了一個如何在類的__init__函數中使用canvas參數?

class Ball: 
    def __init__(self, canvas): 
     self.canvas = canvas 
     self.id = canvas.create_oval(10, 10, 25, 25, fill='red') 
     self.canvas.move(self.id, 25, 25) 
     self.x = 0 
     self.y = -1 
     self.canvas_height = self.canvas.winfo_height 
     self.canvas_width = self.canvas.winfo_width 

和初始化函數包含一個畫布參數,輸入一個名稱的畫布。我已經預先定義在畫布上,並創建在類球:

ball = Ball(canvas) 

但Python的殼輸出這個錯誤:

Traceback (most recent call last): 
File "<pyshell#59>", line 1, in <module> 
ball = Ball(canvas) 
NameError: name 'canvas' is not defined 
+1

您的縮進已關閉。你需要從'self.id'開始的行縮進所有行到最後一級。實際上,'__init__'方法中只有'self.canvas = canvas' – Suever

+0

謝謝。我現在修正了這一點。 – Lumater

+0

在你的代碼中,你定義了一個名爲'canvas'的東西嗎?這個錯誤似乎很明顯。另外,'self.canvas.winfo_height'需要是'self.canvas.winfo_height()'(寬度相同)。這些是功能,而不是屬性。 –

回答

0

你必須定義canvas

canvas = tkinter.Canvas(...) 

ball = Ball(canvas) 

也許你在錯誤的地方定義canvas - 即。在某些功能中 - 執行Ball(canvas)

1

Python使用空白(縮進)來定義一個代碼塊的界限。您需要對齊__init__中的所有行:

class Ball: 
    def __init__(self, canvas): 
     self.canvas = canvas 
     # Lines below this one were unindented in your example: 
     self.id = self.canvas.create_oval(10, 10, 25, 25, fill='red') 
     self.canvas.move(self.id, 25, 25) 
     self.x = 0 
     self.y = -1 
     self.canvas_height = self.canvas.winfo_height 
     self.canvas_width = self.canvas.winfo_width 

但是,這並不會產生您的錯誤。看說明:

ball = Ball(canvas) 
NameError: name 'canvas' is not defined 

變量canvas不是在你打電話Ball(canvas)塊定義。在這種情況下,Python不知道什麼是canvas

+0

這個unindentation是一個複製錯誤,是我複製代碼的一個錯誤。 – Lumater

+0

已編輯,您錯過了一個定義 – slezica