我正在学习来自Java背景的python。对于初学者,我正在Coursera上进行。在解决练习题时,我遇到了这个特定的代码
import simplegui
message = "Welcome!"
# Handler for mouse click
def click():
global message
message = "Good job!"
# Handler to draw on canvas
def draw(canvas):
canvas.draw_text(message, [50,112], 36, "Red")
# Create a frame and assign callbacks to event handlers
frame = simplegui.create_frame("Home", 300, 200)
frame.add_button("Click me", click)
frame.set_draw_handler(draw)
# Start the frame animation
frame.start()
现在我的问题是关于这种特定方法
def draw(canvas):
canvas.draw_text(message, [50,112], 36, "Red")
在此方法中,为什么我确实需要使用该特定参数'canvas'。为什么我不能像
这样简单 def draw():
canvas.draw_text(message, [50,112], 36, "Red")
因为当您从何处调用此方法时
frame.set_draw_handler(draw)
我无论如何都没有传递任何参数。因此参数类型不存在。还是当我从方法set_draw_handler()调用它时。编译器会自动假定它为canvas类型。
谢谢 :)
答案 0 :(得分:3)
您没有传递对draw函数的调用,而是传递了函数本身。这是一个回调:给库提供一个函数,然后库在需要执行某些操作时调用它(在这种情况下,当它需要重绘窗口时)。为了使您的回调能够正常工作,它需要从库中以canvas
参数的形式进行输入,因此库在调用函数时会将其传入。