2014-01-15 80 views
1

我試圖執行此代碼:乒乓球比賽兩名球員Tkinter的錯誤

import Tkinter as tk 
import tkFont 
import functools 
import math 
import random 
import time 

class Pong(tk.Canvas): 

    DEFAULTS = dict(width=640, height=480,background='black',highlightthickness=0) 

    def main(cls): 
     root = tk.Tk() 
     root.title('Pong') 
     root.resizable(False, False) 
     root.bind_all('<Escape>', lambda event: root.destroy()) 
     game = cls(tkFont.Font(family='Book Antiqua', size=15, weight='bold'), 5, 100,background='black', width=640, height=480) 
     game.grid() 
     root.mainloop() 

,但我有這些錯誤:

Traceback (most recent call last): 
    line 413, in <module> 
    pong.main() 
    , line 17, in main 
    game = cls(tkFont.Font(family='Book Antiqua', size=15, weight='bold'), 5, 100,background='black', width=640, height=480) 
AttributeError: Pong instance has no __call__ method 
+1

什麼是CLS您傳遞? – aIKid

+1

你可以告訴我們你在哪裏調用'pong.main()',並在你分配'pong'之前的一段時間? – poke

+0

如果__name__ == '__main__': 乒乓=傍() Pong.main() – user3200290

回答

1

我可以看到一個主要的問題,到目前爲止

CLS未來作爲變量

def main(cls): 

然後你是你唱它像

game = cls(tkFont.Font(family='Book Antiqua', size=15, weight='bold'), 5, 100,background='black', width=640, height=480) 
0

當您在評論中提到的功能,這就是你如何創建pong,並呼籲main

if __name__ == '__main__': 
    pong = Pong() 
    pong.main() 

,在您打電話Pong()要創建實例的時間。因此,您所調用的main方法是一個實例方法,其中第一個隱式參數是實例本身。通常這個參數被命名爲self,例如方法 - 而不是cls

因此,如果我們將其重命名,很明顯是怎麼失敗的算賬:

game = self(tkFont.Font(…), 5, 100, background='black', width=640, height=480) 

記住self是一個對象,並Pong實例。所以它不是一個函數,也不是你可以調用的構造函數;你實際上正試圖調用在這裏不起作用的實例。

我認爲你實際上想要做的是將main作爲「靜態」方法,作爲應用程序的入口點。在這種情況下,你應該添加在方法聲明前的@classmethod裝飾:

@classmethod 
def main(cls): 
    root = tk.Tk() 
    # … 

在這種情況下,cls會確實Pong類型,你可以過一會兒再打來創建Pong對象。

您應該將__name__ == '__main__部分改變,只是Pong.main()不過,因爲你不再調用main例如但整體類型。

if __name__ == '__main__': 
    Pong.main() 
+0

我已經做了你的意思,我有錯誤:Pong.main() TypeError:必須使用Pong實例作爲第一個參數調用unbound方法main() – user3200290

+0

@ user3200290然後你似乎忘記在'def main'前添加'@ classmethod'行。 – poke

+0

對不起,那是因爲我忘了把裝飾器,但現在我有這個錯誤:Pong.main() AttributeError:類Pong沒有屬性'主' – user3200290

0

你正在做一個很奇怪的事情 - 要創建tk.Canvas的子類,但你沒有初始化TK你創建這個對象後,直到。這不是使用tkinter的正確方法。你應該在這個類的範圍之外初始化Tk,或者不要從tk.Canvas繼承。

我建議你重構你的代碼,以便你先初始化tkinter,然後然後創建你的遊戲實例。

例如:

import Tkinter as tk 

class Pong(tk.Canvas): 
    def __init__(self, root): 
     tk.Canvas.__init__(self, root) 
     <put other "main" code here if you want> 

if __name__ == "__main__": 
    root = tk.Tk() 
    pong = Pong(root) 
    pong.pack(fill="both", expand=True) 
    root.mainloop()