——鼠标事件——
(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,逻辑值True或False,如为True则将添加一个新绑定(即新绑定和所有的旧绑定同时响应事件),否则将取代先前该按键的所有绑定(即先前的绑定已经被解绑,不是fun本身被删除)。测试代码附录2,这个例子也说明不同btn的add参数互不相干。
参数fun,事件调用函数,绑定fun指定的鼠标/屏幕事件激发执行的函数或对象方法。fun函数或对象方法要有两个必须参数,以便接受2个坐标。如果fun值为None,则移除该按键的所有绑定,add参数被忽略。测试代码附录3,这个例子也说明不同btn的fun参数互不相干。
为了理解海龟点击事件turtle.onclick(fun, btn=1, add=None),设计了一段测试代码。当点击到海龟时,海龟更换形状。测试代码附录4。通过测试说明只有海龟本身被击中才激发事件。
为了理解画布点击事件turtle.onscreenclick(fun, btn=1, add=None),设计了一段测试代码(附录5)。当用鼠标左键点击海龟开始,结果图片如下
。当用鼠标右键点击海龟开始,结果图片如下
。执行结果说明onscreenclick与onclick是互相独立的事件处理,当鼠标点击到海龟上时,onscreenclick和onclick都响应(如果都绑定而且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()