前提・実現したいこと
小林 郁夫・佐々木 晃共著「Pythonによるプログラミング」p58練習問題2.1に取り組んでいます。複数の車を同時にx方向に動かし、左右の壁で反転させるようにしたいです。自分でも挑戦してみましたが、エラーメッセージが出てうまくいきません。解決法をご教授願います。
発生している問題・エラーメッセージ
以下、下記のプログラムを実行したときに出るエラーメッセージです。車は出現するが動かないという状況です。
Traceback (most recent call last):
File "C:\Users\user\Desktop\python\ex02-1-cars.py", line 81, in <module>
redraw_car(car)
File "C:\Users\user\Desktop\python\ex02-1-cars.py", line 50, in redraw_car
canvas.coords(car.ids,car.x,car.y,car.x+car.l,car.y+car.h)
File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\tkinter_init_.py", line 2761, in coords
self.tk.call((self._w, 'coords') + args))]
_tkinter.TclError: invalid command name ".!canvas"
該当のソースコード
from tkinter import *
from dataclasses import dataclass
import time
DURATION=0.001
X0=150
Y0=150
D=15
VX0=2
@dataclass
class Car:
ids:str
x:int
y:int
l:int
h:int
wd:int
vx:int
bcolor:str
@dataclass
class Border:
left:int
right:int
top:int
bottom:int
def make_car(x, y, l, h, wd=30,vx=4,bcolor="green"):
w_1_x=x+l/4-wd
w_2_x=x+l*3/4-wd
w_y=y+h-wd
id0=canvas.create_rectangle(x, y,x+l,y+h, outline=bcolor, fill=bcolor) id1=canvas.create_oval(w_1_x, w_y, w_1_x+2*wd, w_y+2*wd, outline="black", fill="black") id2=canvas.create_oval(w_2_x, w_y, w_2_x+2*wd, w_y+2*wd, outline="black", fill="black") ids=[id0,id1,id2] return Car(ids,x,y,l,h,wd,vx,bcolor)
def move_car(car):
car.x=car.x+car.vx
def make_walls(ox,oy,width,height):
canvas.create_rectangle(ox,oy,ox+width,oy+height)
def redraw_car(car):
canvas.coords(car.ids,car.x,car.y,car.x+car.l,car.y+car.h)
canvas.coords(car.ids,car.x+car.l/4-car.wd,car.y+car.h-car.wd,car.x+car.l/4+car.wd,car.y+car.h+car.wd)
canvas.coords(car.ids,car.x+car.l3/4-car.wd,car.y+car.h-car.wd,car.x+car.l3/4+car.wd,car.y+car.h+car.wd)
tk=Tk()
canvas=Canvas(tk,width=2000,height=2000,bd=0)
canvas.pack()
tk.update()
border=Border(100,1000,100,800)
make_walls(
border.left,
border.top,
border.right-border.left,
border.bottom-border.top
)
cars=[
make_car(100,150,200,100,30,2,"green"),
make_car(200,250,150,50,30,-4,"red"),
make_car(300,350,400,100,60,-2,"yellow"),
make_car(400,450,200,300,15,4,"gold")
]
while True:
for car in cars:
move_car(car)
if(car.x+car.vx<border.left
or car.x+car.l>=border.right):
car.vx=-car.vx
redraw_car(car)
tk.update()
time.sleep(DURATION)
試したこと
補足情報(FW/ツールのバージョンなど)
回答1件
あなたの回答
tips
プレビュー