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

CodeSkulptor3中draw函数需canvas参数却无参传入set_draw_handler?谁传参?

关于CodeSkulptor3中draw函数参数的疑问解答

先看你给出的代码:

import simplegui

message = "Welcome!"

def click():
  global message
  message = "Good job!"


def draw(canvas):
  canvas.draw_text(message, [50,112], 48, "Red")

frame = simplegui.create_frame("Home", 300, 200)
frame.add_button("Click me", click)
frame.set_draw_handler(draw)
frame.start()

你疑惑的点可以拆成两个部分解释:

  1. 为什么传给set_draw_handler的是draw而不是draw(canvas)?
    这里传递的是函数本身,而不是函数执行后的结果。你可以把函数当成一个“绘图工具”,现在只是把这个工具交给simplegui框架,告诉它:“等需要画东西的时候,就用这个工具来画”。如果写成draw(canvas),那就是直接执行函数了,但此时还没有可用的canvas对象,反而会触发报错。

  2. canvas参数是谁传递的?
    这个canvas对象是simplegui框架自动创建并传递的。当你调用frame.start()启动窗口后,框架会全权负责绘图上下文的管理:

  • 每次窗口需要刷新(比如初始化显示、点击按钮后内容更新),框架都会自动创建当前的canvas对象;
  • 随后调用你传给它的draw函数,把这个canvas对象作为参数传进去;
  • 你的draw函数拿到这个canvas,就能调用它的方法(比如draw_text)完成内容绘制。

简单说,你只需要负责写好“怎么画”(draw函数里的逻辑),而“什么时候画”“用什么画布画”这些事情,都是框架帮你搞定的。

内容的提问来源于stack exchange,提问作者Ryu10

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 05:25:26