0

私はこれをテンプレートとして使用しています:

ブロブのアニメーション

私が見つけることができる唯一の違いは、彼が次の行を使用していることです。

from Tkinter import *

一方、私はラインを使用します

import Tkinter as Tk

これは、Tkinter モジュールへのすべての呼び出しを Tk.(Blob.py に相当) として行うことで説明できると思いました。このブロブ アニメーションの例を実行できますが、プログラムでエラーが発生します。

'Nonetype' object not callable

行で:

allStars[i] = allStars[i]()

以下の私のコードから(この特定の行はコードの最後のブロックにあります):

class Star:

    def __init__(self, canvas, xy, delta):

        self.canvas = canvas
        self.delta = delta

        self.id = self.canvas.create_rectangle(
            xy[0],xy[1],
            xy[0]+starSize,xy[1]+starSize,
            fill='white'
            )


    def __call__(self):
        return self.down

    def down(self):

        xy = self.canvas.coords(self.id)
        if xy[1] >= gameScreenHeight:
            x2 = random.randint(1,gameScreenWidth)
            y2 = 0;
            self.canvas.coords(self.id,x2,y2)
        else:
            self.canvas.move(self.id, 0, self.delta)


root = Tk.Tk()
root.title("Stars")
root.resizable(0,0)
TkPlacement = "%dx%d%+d%+d" % (gameScreenWidth, gameScreenHeight, 10*starSize, heightOffset)
root.geometry(TkPlacement)

frame = Tk.Frame(root, bd = 5, relief=Tk.SUNKEN)
frame.pack()

space = Tk.Canvas(frame, width = gameScreenWidth, height = gameScreenHeight, cursor = 'plus')
space.pack()
space.create_rectangle(0,0,gameScreenWidth,gameScreenHeight,fill="black")



allStars = [
    Star(space, (10,30),3),
    Star(space, (15,60),3),
    Star(space, (80,50),5)
    ]

#N = 99;

#for i in range(N):
#   x1 = random.randint(1,gameScreenWidth)
#   y1 = random.randint(1,gameScreenHeight)
#   aStar = Star(space, (x1,y1), 3)
#   allStars.append(aStar)

root.update()

try:
    while 1:
        for i in range(len(allStars)):
            allStars[i] = allStars[i]()
            root.update_idletasks() # redraw
        root.update() # process events
except Tk.TclError:
    pass # to avoid errors when the window is closed
4

2 に答える 2

2

コードの早い段階でallStars[i]、関数 ( self.done) を設定しました。この関数はNone、明示的な return ステートメントがないために戻ります。

これを行う場合:

allStars[i] = allStars[i]()

allStars[i]... の値をを呼び出した結果に置き換えています。allStars[i]これはNoneです。次にこのコード行が実行されるときallStars[i]Noneであるため、そのエラーが発生します。

アニメーションを実行しようとしている場合、既に無限ループが実行されているため、独自の無限ループを実行するよりも優れた方法があります -- mainloop. たとえば、コードの最後にある while ループと try/catch ブロック全体を次のように削除できます。

def redraw():
    for i in range(len(items)):
        items[i] = items[i]()
    root.after(int(1000/30), redraw) # 30 frames per second

root.after_idle(redraw)
root.mainloop()
于 2013-05-20T12:45:32.057 に答える
1

down()None(暗黙的に)返します。無限ループを初めて通過すると、すべてがallStarsそれに置き換えられます。

allStars[i] = allStars[i]()あなたがそれで何を達成しようとしているのか正確には明らかではありませんが、おそらくあなたが望むものではありません.

于 2013-05-20T12:43:39.180 に答える