前提・実現したいこと
小林 郁夫・佐々木 晃共著の「Pythonによるプログラミング」p133~135の練習問題5.3、5.4に取り組んでいます。最終的にBallクラスを使った複数のボールが壁で跳ね返るアニメーションを作成したいです。自分でも挑戦してみましたが、上手くいきません。ご教授願います。
発生している問題・エラーメッセージ
下記のプログラムを実行すると、このようなエラーメッセージが出て、ボールがずっと停止したままになります。
Traceback (most recent call last):
File "C:/Users/user/Desktop/python/ex05-bounce.py", line 70, in <module>
tk.update()
File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\tkinter_init_.py", line 1305, in update
self.tk.call('update')
_tkinter.TclError: can't invoke "update" command: application has been destroyed
該当のソースコード
以下、自分で作成したプログラムです。
from tkinter import *
import time
DURATION=0.001
class Ball:
def init(self,id,x,y,d,vx,vy,c):
self.id=id
self.x=x
self.y=y
self.d=d
self.vx=vx
self.vy=vy
self.c=c
def move(self): self.x=self.x+self.vx self.y=self.y+self.vy def redraw(self): d=self.d canvas.coords(self.id,self.x-d,self.y-d, self.x+d,self.y+d)
class Border:
def init(self,l,r,t,b):
self.l=l
self.r=r
self.t=t
self.b=b
def draw(self): canvas.create_rectangle(self.l,self.t,self.r-self.l,self.b-self.t)
def make_ball(x,y,d,vx,vy,c):
id=canvas.create_rectangle(x,y,x+d,y+d,
fill=c,outline=c)
ball=Ball(id,x,y,d,vx,vy,c)
return ball
tk=Tk()
canvas=Canvas(tk,width=800,height=600,bd=0)
canvas.pack()
border=Border(100,700,100,500)
border.draw
balls=[
make_ball(150,150,20,2,3,"darkblue"),
make_ball(200,250,25,-4,-3,"orange"),
make_ball(300,350,10,-2,6,"green"),
make_ball(400,450,5,10,-6,"darkgreen")
]
while True:
for ball in balls:
ball.move
if (ball.x-ball.d<border.l):
ball.vx=-ball.vx
if(ball.y-ball.d<border.t):
ball.vy=-ball.vy
if(ball.x+ball.d>=border.r):
ball.vx=-ball.vx
if(ball.y+ball.d>=border.b):
ball.vy=-ball.vy
ball.redraw
tk.update()
time.sleep(DURATION)
試したこと
補足情報(FW/ツールのバージョンなど)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/17 12:16