brython | 笨办法写个连连看-2. 监听鼠标事件

简介: brython | 笨办法写个连连看-2. 监听鼠标事件

各位前端大佬勿笑话,运维小弟献丑了。

前段事件在【码上掘金】看见大佬使用【文言文】写了一个连连看,于是我也想用【brython】也实现一个连连看。



完成一个简单的点击事件


鼠标事件,也称之为Mouse Event,是指捕获鼠标操作所触发的事件,当然现在智能手机、平板等,在滑动屏幕的时候,也可以一并称之为鼠标事件。


仅需如下数行代码即可完成一个最简单的点击事件注册

from browser import document
from browser import html
btn = html.BUTTON("点击我触发事件")
btn.id = "btn"
document <= btn
def sayHello(ev):
    print("hello juejin pdudo" , ev)
document["btn"].bind("click",sayHello)

如上代码,先申请一个按钮,其id属性赋值为btn, 接着为该按钮注册一个鼠标点击事件,触发的函数为sayHello,鼠标事件为click即为: 在btn上单击左键松开后会触发事件。


如上案例中,我们将bind称之为绑定方法,

接着我们运行代码,我们会得到这样的一种效果

image.png

代码也已经放到【码上掘金】下面了

code.juejin.cn/pen/7167010…

鼠标监听事件有哪些

brython给提供的鼠标事件有哪些呢?我整理为了一个表格,如下:

鼠标事件 类型 解释
click 点击事件 在监听的元素上单击左键松开后会触发事件
dblclick 点击事件 在监听的元素上双击左键松开后会触发事件
mouseup 点击事件 在监听的元素上按下鼠标松开后,会触发事件(左键、右键、滚轮都会触发)
mousedown 点击事件 在监听的元素上按下鼠标会触发事件(左键、右键、滚轮都会触发)
mouseenter 移动事件 挪到监听的元素上时会触发事件,挪到其子元素时,不会产生的事件
mouseleave 移动事件 挪到监听的元素上再挪出来的时会触发事件,挪到其子元素时,不会产生的事件
mouseover 移动事件 挪到监听的元素上时会触发事件,挪到其子元素时,也会触发事件
mouseout 移动事件 挪到监听的元素上再挪出来的时会触发事件,挪到其子元素再挪出来时,也会触发事件
mousemove 移动事件 在监听的元素上移动的时候会触发事件

如果学过javascript的话,会觉得上述点击事件非常熟悉,当然了,brython的工作原理是将python代码,通过某种方式,解析为javascript从而在浏览器中运行。所以说,有些写法和javascript差别不大。


如果要区分一下的话,可以将其区分为点击事件和移动事件。



点击事件


在上述提供的鼠标事件中,其中clickdblclickmouseupmousedown 都是鼠标点击事件。

按照监听键值来区分的话,可以归纳为2类


  • clickdbclick只能监听鼠标左键
  • mouseupmousedown 则可以监听到左键、右键以及滚轮

如果按照触发事件来区分的话,也可以归纳为2类

  • clickdbclick以及 mouseup会在鼠标释放后触发事件
  • mousedown 在点击后就触发事件

上述案例中,使用了click来监听,可以做个实验;证明是松开后触发, 点击后拖到其他区松开再来看反馈。


image.png


可以发现,在点击后,拖着鼠标在别的地方松开,是不会触发事件的。


如前面介绍,mouseupmousedown可以监听所有的鼠标按键,那么怎么分辨 左键、右键、以及滚轮呢?


brython已经为我们定义好了,在点击事件中,有一个参数是button,该参数值的意义如下:

  • 0: 左键
  • 1: 轮滚
  • 2: 右键

其他3种监听事件,也写成了案例,放到【码上掘金】上了,可以尝试下

code.juejin.cn/pen/7167010…

image.png



移动事件


点击事件较为简单,而移动事件就较为复杂一点了。

from browser import document
from browser import html
document <= html.DIV(id="div1")
div1 = document["div1"]
div1.style.width = "300px"
div1.style.height = "300px"
div1.style.background = "green"
document <= html.DIV(id="div2")
div2 = document["div2"]
def showInfos(ev):
    div2.clear()
    div2 <= html.P("x:"+str(ev.x)+" y"+str(ev.y))
document["div1"].bind("mousemove",showInfos)



如上代码监听的是div1,监听的事件是mousemove,触发的函数为showInfos,在其中,我们向div2输出距离窗口的像素,执行后,可以看到如下效果。

image.png


上述案例,也放到了码上掘金上:

code.juejin.cn/pen/7167011…

在鼠标移动事件中,除了mousemove在监听的元素上移动就会触发事件,而其他移动事件,也可以分为2个部分,即:


  • mouseentermouseover: 只要挪到监听事件上就会触发事件
  • mouseleavemouseout: 挪到监听事件上后在挪出来才会产生事件,即焦点在监听的元素上时不会触发事件,只有挪出来后才会触发事件

哎,可能有小伙伴要问了,挪到监听事件上就会触发事件,那么mouseentermouseover都能实现,有什么区别呢? 区别是挪到其子元素是否会触发事件,其分为2个部分,如下:


  • mouseentermouseleave 在挪到其子元素上时,不会触发事件
  • mouseovermouseout 在挪到其子元素上时,也会触发事件
mouseenter 移动事件 挪到监听的元素上时会触发事件,挪到其子元素时,不会产生的事件
mouseleave 移动事件 挪到监听的元素上再挪出来的时会触发事件,挪到其子元素时,不会产生的事件
mouseover 移动事件 挪到监听的元素上时会触发事件,挪到其子元素时,也会触发事件
mouseout 移动事件 挪到监听的元素上再挪出来的时会触发事件,挪到其子元素再挪出来时,也会触发事件
mousemove 移动事件 在监听的元素上移动的时候会触发事件

为此,写了一个简单的demo,运行后效果如下:


image.png



代码将其放到了【码上掘金】中

code.juejin.cn/pen/7167012…



鼠标事件属性


除此之外,brython在点击的时候,提提供了点位(不管是点击事件还是移动事件),具体汇总为表格如下:

属性值 含义
x 鼠标点位到左边窗口的像素
y 鼠标点位到上边窗口的像素
clientX 在DOM中的X坐标
clientY 在DOM中的Y坐标
screenX 在屏幕中的X坐标
screenY 在屏幕中的Y坐标



这个就不写代码演示了,有兴趣的可以运行下这个demo即可:

from browser import document
from browser import html
from browser import console
document <= html.DIV(id="div1")
div1 = document["div1"]
div1.style.width = "300px"
div1.style.height = "300px"
div1.style.backgroundColor = "red"
def showinfos(ev):
    console.log("x:",ev.x," y:",ev.y," clientX:",ev.clientX," clientY:",ev.clientY," screenX:",ev.screenX," screenY:",ev.screenY)
document["div1"].bind("mousemove",showinfos)



连连中如何抓出table中对应的值


在连连看中,有个前提是地图的制作,因为还没有详细的介绍连连看地图制作,所以这里就初略的介绍一下,来作为继续讲解鼠标事件的铺垫。


在我们brython实现的连连看中,我们使用的是table作为各种图案的标配

使用6*6个格子来做一个地图,图示如下



image.png


其中 1-6 的数字 假如都是连连看的图案,要如何抓出其中的数值呢? 我们将整个table都定义为监听属性,在鼠标点击后,我们拿到其中的td的值即可。


为此,我们可以模拟出一个

image.png


代码我放到【码上掘金】了:

code.juejin.cn/pen/7167334…

现在我们可以取值了,那还有一个问题: 我们如何判断2点到底在哪儿?对于整个table而言,下标应该是什么呢? 这个就留着下次介绍练练看地图的时候再讲解了。



总结


鼠标监听事件就介绍完咯,总体而言,在一般项目中,我们使用最多的就是click事件了,之前实现的连连看也是使用click事件哦。


好了,快动动你的小手指来试试吧。



相关文章
|
7月前
|
机器学习/深度学习 计算机视觉
YOLOv11改进策略【注意力机制篇】| 添加SE、CBAM、ECA、CA、Swin Transformer等注意力和多头注意力机制
YOLOv11改进策略【注意力机制篇】| 添加SE、CBAM、ECA、CA、Swin Transformer等注意力和多头注意力机制
1953 2
YOLOv11改进策略【注意力机制篇】| 添加SE、CBAM、ECA、CA、Swin Transformer等注意力和多头注意力机制
|
9月前
|
人工智能 物联网 PyTorch
ChatTTSPlus:开源文本转语音工具,支持语音克隆,是 ChatTTS 的扩展版本
ChatTTSPlus 是一个开源的文本转语音工具,是 ChatTTS 的扩展版本,支持语音克隆、TensorRT 加速和移动模型部署等功能,极大地提升了语音合成的性能和灵活性。
627 5
ChatTTSPlus:开源文本转语音工具,支持语音克隆,是 ChatTTS 的扩展版本
|
算法 定位技术
连连看核心算法与基本思想(附全部项目代码链接与代码详细注释)
连连看核心算法与基本思想(附全部项目代码链接与代码详细注释)
663 0
|
存储 JSON Java
如何在Java中设计灵活的配置管理系统
如何在Java中设计灵活的配置管理系统
|
定位技术 Python
用Python Tkinter打造的精彩连连看小游戏【附源码】
用Python Tkinter打造的精彩连连看小游戏【附源码】
368 0
Map.entry方法总结
Map.entry方法总结
|
机器学习/深度学习 计算机视觉 Python
【Python计算机视觉】项目实战之图像增强imguag对关键点变换、标注框变化(附源码 超详细必看)
【Python计算机视觉】项目实战之图像增强imguag对关键点变换、标注框变化(附源码 超详细必看)
339 0
cesium根据id选中实体
cesium根据id选中实体
716 0
|
人工智能 自然语言处理 安全
华为「鸿蒙」出世:全球首个微内核全场景分布式OS,可取代安卓,发布即开源
华为自研的鸿蒙系统究竟有多强大?刚刚,余承东在 HDC 2019 上为我们揭开了它的面纱——鸿蒙 OS,是一个划时代的全新操作系统。
1426 0
华为「鸿蒙」出世:全球首个微内核全场景分布式OS,可取代安卓,发布即开源