强基初中数学&学Python——第九十六课 海龟画图基本操作方法之十:鼠标事件与手写板

——鼠标事件——

(1)海龟点击事件turtle.onclick(fun, btn=1, add=None)

(2)画布点击事件turtle.onscreenclick(fun, btn=1, add=None)

(3)海龟拖动事件turtle.ondrag(fun, btn=1, add=None)

(4)海龟释放事件turtle.onrelease(fun, btn=1, add=None)

  参数btn,鼠标按钮编号,默认值为 1 (鼠标左键)。通过测试(测试代码附录1),鼠标左键是1,右键是3,我这里btn=2(即中间键)无响应。同学们可以拷贝附录1保存在py文件中后测试。

  参数add逻辑值TrueFalse,如为True则将添加一个新绑定(即新绑定和所有的旧绑定同时响应事件),否则将取代先前该按键的所有绑定(即先前的绑定已经被解绑,不是fun本身被删除)。测试代码附录2,这个例子也说明不同btnadd参数互不相干

  参数fun事件调用函数,绑定fun指定的鼠标/屏幕事件激发执行的函数或对象方法。fun函数或对象方法要有两个必须参数,以便接受2个坐标。如果fun值为None,则移除该按键的所有绑定,add参数被忽略。测试代码附录3,这个例子也说明不同btnfun参数互不相干

  为了理解海龟点击事件turtle.onclick(fun, btn=1, add=None),设计了一段测试代码。当点击到海龟时,海龟更换形状。测试代码附录4。通过测试说明只有海龟本身被击中才激发事件

  为了理解画布点击事件turtle.onscreenclick(fun, btn=1, add=None),设计了一段测试代码(附录5)。当用鼠标左键点击海龟开始,结果图片如下

 

。当用鼠标右键点击海龟开始,结果图片如下

 

。执行结果说明onscreenclickonclick是互相独立的事件处理,当鼠标点击到海龟上时,onscreenclickonclick都响应(如果都绑定而且btn相同),当鼠标没有点到海龟时,只有onscreenclick响应。

  为了理解海龟拖动事件turtle.ondrag(fun, btn=1, add=None),设计了一段代码测试拖动海龟划线。测试代码(手写板)附录6。手动写了测试两字如下。

 

  为了理解海龟释放事件turtle.onrelease(fun, btn=1, add=None),改写上面的手写板代码(附录7)。手动写了测试两字如下。

 

  练习题1修改附录7代码,使写字板可以改变笔画颜色。

 

附录1

#鼠标按键测试
import turtle as t
t.setup(500, 500)
t.screensize(400, 400)
t.shape("square")
def msk1(px,py):
    print("鼠标左键被点击。")    
def msk2(px,py):
    print("鼠标中键被点击。")    
def msk3(px,py):
    print("鼠标右键被点击。")    
t.onclick(msk1)
t.onclick(msk2, btn=2, add=True)
t.onclick(msk3, btn=3, add=True)
t.mainloop()

 

附录2

#鼠标事件add参数测试
import turtle as t
t.setup(500, 500)
t.screensize(400, 400)
t.shape("square")
def msk11(px,py):
    print("鼠标左键(前)被点击。")
def msk12(px,py):
    print("鼠标左键(后)被点击。")
def msk13(px,py):
    print("鼠标左键(新)被点击。") 
def msk31(px,py):
    print("鼠标右键(前)被点击。")
def msk33(px,py):
    print("鼠标右键(新)被点击。")
def msk32(px,py):
    print("鼠标右键(后)被点击。")
    t.onclick(msk33, btn=3)
t.onclick(msk11)
t.onclick(msk12, add=True)
t.onclick(msk13, add=True)
t.onclick(msk31, btn=3)
t.onclick(msk32, btn=3, add=True)
t.mainloop()

 

附录3
#鼠标事件参数fun=None测试
import turtle as t
t.setup(500, 500)
t.screensize(400, 400)
t.shape("square")
def msk11(px,py):
    print("鼠标左键(前)被点击。")
def msk12(px,py):
    print("鼠标左键(后)被点击。")
def msk13(px,py):
    print("鼠标左键(新)被点击。")
    t.onclick(None)   
def msk31(px,py):
    print("鼠标右键(前)被点击。")
def msk32(px,py):
    print("鼠标右键(后)被点击。")
def msk33(px,py):
    print("鼠标右键(新)被点击。")
    t.onclick(None, btn=3, add=True)
t.onclick(msk11)
t.onclick(msk12, add=True)
t.onclick(msk13, add=True)
t.onclick(msk31, btn=3)
t.onclick(msk32, btn=3, add=True)
t.onclick(msk33, btn=3, add=True)
t.mainloop()

 

附录4
#鼠标事件turtle.onclick测试
import turtle as t
t.setup(500, 500)
t.screensize(400, 400)
t.shape("square")
def msk(px,py):
    if "square"==t.shape():
        t.shape("turtle")
    else:
        t.shape("square")
t.onclick(msk)
t.mainloop()

 

附录5

#鼠标事件turtle.onscreenclick测试
import turtle as t
t.setup(500, 500)
t.screensize(400, 400)
t.shape("square")
def msk(px,py):
    if "square"==t.shape():
        t.shape("turtle")
    else:
        t.shape("square")
def mv1(px,py):
    t.setpos(px,py)
    t.write("(%d, %d)" % (px,py))
def mv2(px,py):
    t.setpos(px,py)
    t.write("(%d, %d)" % (px,py))    
t.onclick(msk)
t.onscreenclick(mv1)
t.onscreenclick(mv2,btn=3)
t.mainloop()

附录6

#鼠标事件turtle.ondrag测试
import turtle as t
t.setup(500, 500)
t.screensize(400, 400)
t.shape("circle")
def msk(px,py):
    t.ondrag(None)  #限制程序混乱
    t.setpos(px,py)
    t.ondrag(msk)
#点击改变笔状态    
def penchange(px,py):
    if t.isdown():
        t.up()
    else:
        t.down()
t.ondrag(msk)
t.onclick(penchange, btn=3)   #点右键改变笔状态
t.mainloop()

附录7

#鼠标事件turtle.ondrag测试
import turtle as t
t.setup(500, 500)
t.screensize(400, 400)
t.shape("circle")
def msk(px,py):
    t.ondrag(None)  #限制程序混乱
    t.setpos(px,py)
    t.ondrag(msk)
#笔状态字
penstatus=False
def changestatus(px,py):
    global penstatus
    penstatus = not penstatus   
def penchange(px,py):
    if t.isdown():
        t.up()
    elif penstatus:  #只有状态字为真时才下笔。
        t.down()
t.ondrag(msk)
t.onrelease(changestatus)  #奇数次释放笔状态字=True,偶数次释放笔状态字=False
t.onclick(penchange)  #鼠标点击根据笔状态字改变笔的状态
t.mainloop()