下面的笔记内容来自coursera上的Python公开课。
in CodeSkulptor, we're going to register the draw handler using a simpleGUI command that we’ll learn. And then, once we've registered it, CodeSkulptor calls the draw handler at around 60 times per second.
What the draw handler does, is the draw handler then updates the canvas, cause all of our drawings going to take place in CodeSkulptor, using a collection of draw commands. That include things like draw_text or draw_line, or something like draw_circle.
例1.1 first example of drawing on the canvas
import simplegui # define draw handler 注意这里的参数canvas看上去好像从天而降一样,其实这是语法惯例 def draw(canvas): canvas.draw_text("Hello!",[100, 100], 24, "White") canvas.draw_circle([150, 150], 30,10 , "Red") # create frame frame = simplegui.create_frame("Text drawing", 300, 200) # register draw handler frame.set_draw_handler(draw) # start frame frame.start()
画图效果如下
# standard HMTL color such as "Red" and "Green" # note later drawing operations overwrite earlier drawing operations import simplegui # Handler to draw on canvas def draw(canvas): canvas.draw_circle([100, 100], 50, 2, "Red", "Pink") canvas.draw_circle([300, 300], 50, 2, "Red", "Pink") canvas.draw_line([100, 100],[300, 300], 2, "Black") canvas.draw_circle([100, 300], 50, 2, "Green", "Lime") canvas.draw_circle([300, 100], 50, 2, "Green", "Lime") canvas.draw_line([100, 300],[300, 100], 2, "Black") canvas.draw_polygon([[150, 150], [250, 150], [250, 250], [150, 250]], 2, "Blue", "Aqua") canvas.draw_text("An example of drawing", [60, 385], 24, "Black") # Create a frame and assign callbacks to event handlers frame = simplegui.create_frame("Home", 400, 400) frame.set_draw_handler(draw) frame.set_canvas_background("Yellow") # Start the frame animation frame.start()
画图效果如下
2 string manipulation例2.1 Handle single quantity
def convert_units(val, name):
result = str(val) + " " + name
if val > 1:
result = result + "s"
return result
# convert xx.yy to xx dollars and yy cents
def convert(val):
# Split into dollars and cents
dollars = int(val)
cents = int(round(100 * (val - dollars)))
# Convert to strings
dollars_string = convert_units(dollars, "dollar")
cents_string = convert_units(cents, "cent")
# return composite string
if dollars == 0 and cents == 0:
return "Broke!"
elif dollars == 0:
return cents_string
elif cents == 0:
return dollars_string
else:
return dollars_string + " and " + cents_string
# 测试用例如下
print convert(11.23) print convert(11.20) print convert(1.12) print convert(12.01) print convert(1.01) print convert(0.01) print convert(1.00) print convert(0)
#测试结果如下
11 dollars and 23 cents
11 dollars and 20 cents
1 dollar and 12 cents
12 dollars and 1 cent
1 dollar and 1 cent
1 cent
1 dollar
注意
其实这行 " cents = int(round(100 * (val - dollars))) "很诡异。如果去掉round写为 cents = int(100 * (val - dollars)),那么print convert(11.20)将返回11 dollars and 19 cents.
例2.2 现在把这个string的输出内容表达在canvas上面
import simplegui # define global value value = 3.12 # Handle single quantity def convert_units(val, name): result = str(val) + " " + name if val > 1: result = result + "s" return result # convert xx.yy to xx dollars and yy cents def convert(val): # Split into dollars and cents dollars = int(val) cents = int(round(100 * (val - dollars))) # Convert to strings dollars_string = convert_units(dollars, "dollar") cents_string = convert_units(cents, "cent") # return composite string if dollars == 0 and cents == 0: return "Broke!" elif dollars == 0: return cents_string elif cents == 0: return dollars_string else: return dollars_string + " and " + cents_string # define draw handler def draw(canvas): canvas.draw_text(convert(value), [60, 110], 24, "White") # define an input field handler def input_handler(text): global value value = float(text) # create frame frame = simplegui.create_frame("Converter", 400, 200) # register event handlers frame.set_draw_handler(draw) frame.add_input("Enter value", input_handler, 100) # start frame frame.start()注意:
def input_handler(text_input): … frame = simplegui.create_frame('Testing', 100, 100) inp = frame.add_input('My label', input_handler, 50)