python-2.7 - pong游戏两个球员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

时间: 作者:

现在我可以看到一个主要问题

作为变量传入的cls


def main(cls): 

然后你就像一个函数一样使用它


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

作者:

就像你在注释中提到的,这是创建 pong 和调用 main的方式:


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

在你调用 Pong() 时,你正在创建一个实例 。 因此,调用的main 方法是一个实例方法,其中第一个隐式参数是实例本身。 通常,这个参数名为 self,如你所做的methods—not cls

所以如果我们重命名它,很明显,后面是什么失败了:


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

请记住 self 是一个对象,pong的实例。 所以它不是一个函数,而且不是你可以调用的构造函数;你实际上正在尝试调用这里的实例。

我想你真正想做的是把 main 作为"static"方法,作为你应用程序的入口点。 这样,你应该在方法声明前面添加 @classmethod 修饰符:


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

在这种情况下,cls 实际上是类型 pong,你可以稍后调用以创建 pong 对象。

虽然你不再调用 __name__ =='__main__,但是你应该将你的部分更改为 Pong.main() 实例,但整个类型是。


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

作者:

在创建一个,子类之前,你正在做一个非常奇怪的事件,但是在创建这里对象之后。 这不是使用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()

作者:
...