simplegui动画导入threading出现NotImplementedError问题求助
报错含义
你当前使用的simplegui运行在Skulpt环境下,Skulpt是面向浏览器端的Python解释器实现,官方尚未完成threading模块的开发适配,因此调用threading相关接口时会抛出NotImplementedError,该报错表示你当前环境不支持你调用的功能,并非代码逻辑错误。
替代实现方案
你完全不需要用多线程就能实现需求,simplegui的draw_handler本身会以固定频率自动调用,直接在该回调中更新坐标、判断边界即可,实现逻辑如下:
- 为两个运动的圆形分别定义速度全局变量,水平运动的圆只修改x坐标,垂直运动的圆只修改y坐标
- 每次调用
draw_handler时先更新对应坐标,再判断是否触碰画布边界,触碰后将对应速度取反即可实现往复运动 - 如需避免碰撞,每次更新坐标后计算两个圆心的欧氏距离,若小于两圆半径之和则调整坐标或反转速度即可
修正后可运行示例代码
import simplegui # 初始化画布、圆形参数 WIDTH = 400 HEIGHT = 400 RADIUS = 50 # 水平运动圆参数 x1 = 50 y1 = 100 vx1 = 5 # 垂直运动圆参数 x2 = 200 y2 = 50 vy2 = 5 def draw_handler(canvas): global x1, vx1, y2, vy2 # 更新水平圆坐标+边界判断 x1 += vx1 if x1 <= RADIUS or x1 >= WIDTH - RADIUS: vx1 = -vx1 # 更新垂直圆坐标+边界判断 y2 += vy2 if y2 <= RADIUS or y2 >= HEIGHT - RADIUS: vy2 = -vy2 # 碰撞判断:两圆心距离小于2倍半径则反转速度避免碰撞 dx = x1 - x2 dy = y1 - y2 if (dx**2 + dy**2) ** 0.5 < 2 * RADIUS: vx1 = -vx1 vy2 = -vy2 # 绘制两个圆形 canvas.draw_circle((x1, y1), RADIUS, 1, "White", "White") canvas.draw_circle((x2, y2), RADIUS, 1, "Red", "Red") frame = simplegui.create_frame('Testing', WIDTH, HEIGHT) frame.set_canvas_background("Black") frame.set_draw_handler(draw_handler) frame.start()
内容的提问来源于stack exchange,提问作者Parallel To Death Official
相关产品推荐
相关产品推荐

