You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 17:24:06