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()
你疑惑的点可以拆成两个部分解释:
为什么传给
set_draw_handler的是draw而不是draw(canvas)?
这里传递的是函数本身,而不是函数执行后的结果。你可以把函数当成一个“绘图工具”,现在只是把这个工具交给simplegui框架,告诉它:“等需要画东西的时候,就用这个工具来画”。如果写成draw(canvas),那就是直接执行函数了,但此时还没有可用的canvas对象,反而会触发报错。canvas参数是谁传递的?
这个canvas对象是simplegui框架自动创建并传递的。当你调用frame.start()启动窗口后,框架会全权负责绘图上下文的管理:
- 每次窗口需要刷新(比如初始化显示、点击按钮后内容更新),框架都会自动创建当前的canvas对象;
- 随后调用你传给它的draw函数,把这个canvas对象作为参数传进去;
- 你的draw函数拿到这个canvas,就能调用它的方法(比如
draw_text)完成内容绘制。
简单说,你只需要负责写好“怎么画”(draw函数里的逻辑),而“什么时候画”“用什么画布画”这些事情,都是框架帮你搞定的。
内容的提问来源于stack exchange,提问作者Ryu10
相关产品推荐
相关产品推荐

