pythoncamp0

第二个程序(制作可回放的彩点画板)

题目要求

  • 可回放的点彩画板
  • 期待:
    • 三种形状画笔可选: 三角/方形/圆形
    • 颜色可定义: 颜色名 或是 RGB 声明
    • 每次 鼠标 点击画板任意一处,都绘制一个当前画笔可用彩色形状
    • 可记录1024次点彩绘制行为
    • 可回放整个记录的绘制行为
  • 要求:
    • 基础: 有画笔,可点绘
    • 可用: 有画笔,有颜色,可点绘
    • 合格: 有画笔,有颜色,可点绘,可回放
    • 天才: 有画笔,有颜色,可点绘,可回放,回放速度可调节,回放可输出为文件

解题思路

基本框架

  • 创建模版(inport)
  • 创建框架等(frame/timer)
  • 注册事件(frame.set/frame.add)
  • 定义全局变量(global)
  • 调用事件(def)
  • 创建辅助函数
  • 开始(start Frame&Timer)

具体步骤

  • 创建模版(inport)

    可以在 Docs 中找到自己要用的模版,如本题中要用到:

     inport simplehui
    
     inport match
    
  • 创建框架等(frame/timer)

    • 创建一个可以鼠标点击的画板框架:

        frame = simplegui.create_frame("Mouse selection", width, height)
      
    • 创建一个用于回放的计时器:

        timer = simplegui.create_timer(interval, timer_handler)
      
  • 注册事件(frame.set/frame.add)

    • 注册画板(canvas)、按钮(button)、鼠标点击(mouseclick )、画图(draw)等事件。

      举例:

        frame.set_canvas_background("White") ——注册一个背景为白色的画板
        frame.add_button("红色\n",click_red,100) ——注册一个写着红色的按钮,宽度为100
      

      按照上面的例子,完成注册,在写代码的过程中发现要用什么,可以再回头补齐,一些基本用法,求助 Docs。

  • 定义全局变量(global)

     定义所有要用到的全局变量,可以在用到时回头补足。
    
  • 调用事件(def)

     定义注册的每一个事件触发后做什么,暂时不写的,用 pass 忽略此事件。
    
  • 创建辅助函数

  • 开始(start Frame&Timer)

    这个可以一开始创建框架和计时器时就写好:

      frame.start() 
    
      timer.start()——在这个程序中计时器有一点特殊,它不能在一开始就触发,而要在点击回放时调用,所以timer.start()写在调用点击回放按钮的事件中。
    

遇到并解决的问题

折腾过程:

  • 问题1

    已经可以改变形状盒颜色 问题是画板上原先的图案也跟着全都一起变了

  • 解决问题1

    全局变量的问题

  • 问题2

    加了计时器,但一运行就自动回放,无法绘图。

  • 问题3

    可回放,但加速减速有问题,结果都是越来越快。

  • 解决问题3

    加入了if timer.is_running():

      timer.stop() 语句(在dos里面查找想要的语法)现在只剩回放输出文件的问题。
    
  • 修改
    在回放时点击画布不能再添加图案,以免回放被打乱。

问题解决:

  • [问题1] 全局变量

    • 要注意全局变量的设置

      在这个题目中,一个图案有三个参数(位置,形状,颜色)—— 形状和颜色要设为全局变量。

      位置是一个列表,其特性和全局变量一样,不需要另外设置。

      但位置这个参数本身鼠标点击画板后获取的pos(x,y)。这涉及到第一个问题的第二个方面——参数:

  • [问题1] 参数

    • pos本身是一个位置参数,但它其中又包含两个像素参数——x,y,注意不要弄混参数的层级。
  • [问题2]Start 一个计时器时,要看它是在什么事件下触发
 * 想在点击某个按钮触发该事件时计时器才启动,start.timer()写在触发它的事件里,而不要写在全局。
  • [问题3] timer 的 interval 变量问题

    • 蝈蝈回答,timer在运行时不能改变它的变量interval

      在 Docs 中找到了 timer.is_running 和 timer.stop() 语句。

    • 引申类比:不能在for...in...遍历(迭代)时改变/删除列表中的元素。

Tips

  • 可视化分析

    • codeskulptor 右上角的 Viz Mode 按钮,点击进入新的页面,粘贴你想要分析的代码。
    • 点击工具,出现如图四个黄框按钮:
  • 点击运行后,就可以用上图的四个黄框按钮逐步检查运行情况。

    • 左右按钮逐行代码检查,上下按钮逐个事件检查。