前提・実現したいこと
Python初心者です。今本を見ながら勉強しているのですが、つまずいてしまいました。
Tkinterを使って、”壁を作り、壁の中で車を動かし、壁にぶつかったら進行方向が変わる(水平運動)”というプログラムを作ろうとしているのですが、壁と車は表示されるのですが、車は動くことなくエラーが表示されてしまいます。
発生している問題・エラーメッセージ
Traceback (most recent call last):
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 = 100
Y0 = 150
D = 10
VX0 = 2
@dataclass
class Car:
ids: list
x: int
y: int
d: int
vx:int
c: str
@dataclass
class Border:
left: int
right: int
top: int
bottom:int
def make_car(x, y, l, h, wr, vx=2, c="red"):
id0 = canvas.create_rectangle(x, y, x + l, y + h, fill=c, outline=c)
id1 = canvas.create_oval(x + l/4 - wr, y + h - wr, x + l/4 + wr, y + h + wr, fill="black", outline="black")
id2 = canvas.create_oval(x + l3/4 - wr, y + h - wr, x + l3/4 + wr, y + h + wr,
fill="black", outline="black")
ids = [id0, id1, id2]
return Car(ids, x, y, l, h, wr)
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):
d = Car.d
canvas.coords(Car.ids, Car.x, Car.y,
Car.x + d, Car.y + d)
tk = Tk()
canvas = Canvas(tk, width=800, height=600, bd=0)
canvas.pack()
tk.update()
border = Border(100, 700, 100, 500)
make_walls(
border.left,
border.top,
border.right - border.left,
border.bottom - border.top
)
Car = make_car(X0, Y0, X0, Y0 - X0, D)
while True:
move_car(Car)
if (Car.x + Car.vx < border.left
or Car.x + Car.d >= border.right):
Car.vx = -Car.vx
redraw_car(Car)
tk.update()
time.sleep(DURATION)
試したこと
いろんなところをいじって試行錯誤した
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/04 14:56