Tkinter实现Canvas赛车循环移动及方向键调速功能咨询
实现方案
- 循环移动实现:每次移动后读取车身右侧边界,当超过画布宽度1200时,用
coords方法重置所有赛车组件到初始坐标即可实现循环 - 按键调速实现:给主窗口绑定上下方向键事件,通过修改每次移动的步长
self.x调整速度,设置最低速度限制避免赛车静止或反向移动 - 额外添加画布焦点设置,保证键盘事件可以正常触发
完整修改后代码
# 导入tkinter模块所有内容 from tkinter import * # 创建赛车类 class RACECAR: def __init__(self): window = Tk() window.title("Racing Car") # 初始移动步长,数值越大速度越快 self.x = 1 self.y = 0 # 画布宽度固定为1200,后续边界判断直接用该值 self.canvas_width = 1200 self.canvas = Canvas(window, width = self.canvas_width, height = 400, bg = "white") self.canvas.pack() # 给画布设置焦点,保证能接收键盘事件 self.canvas.focus_set() # 绑定上下方向键事件 window.bind("<Up>", self.increase_speed) window.bind("<Down>", self.decrease_speed) self.displayCar() window.mainloop() def displayCar(self): self.body = self.canvas.create_rectangle(0, 300, 150, 350, tags = "rect", fill = "black") self.wheel1 = self.canvas.create_oval(100, 350, 150, 400, tags = "oval", fill = "black") self.wheel2 = self.canvas.create_oval(0, 350, 50, 400, tags = "oval", fill = "black") self.hood = self.canvas.create_rectangle(0, 250, 100, 300, tags = "rect", fill = "black") self.movement() def movement(self): # 移动所有赛车组件 self.canvas.move(self.body, self.x, self.y) self.canvas.move(self.wheel1, self.x, self.y) self.canvas.move(self.wheel2, self.x, self.y) self.canvas.move(self.hood, self.x, self.y) # 判断赛车是否完全移出画布 car_right_edge = self.canvas.bbox(self.body)[2] if car_right_edge >= self.canvas_width: # 重置所有组件到初始坐标 self.canvas.coords(self.body, 0, 300, 150, 350) self.canvas.coords(self.wheel1, 100, 350, 150, 400) self.canvas.coords(self.wheel2, 0, 350, 50, 400) self.canvas.coords(self.hood, 0, 250, 100, 300) self.canvas.after(100, self.movement) # 提速方法 def increase_speed(self, event): self.x += 0.5 # 降速方法,限制最低速度为0.5 def decrease_speed(self, event): if self.x > 0.5: self.x -= 0.5 RACECAR()
内容的提问来源于stack exchange,提问作者Michael Aguirre
相关产品推荐
相关产品推荐

