我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Compose for Desktop鼠标事件源码分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Compose for Desktop鼠标事件源码分析

这篇文章主要讲解了“Compose for Desktop鼠标事件源码分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Compose for Desktop鼠标事件源码分析”吧!

鼠标事件监听器

点击监听器

点击监听器在安卓Compose 和Compose for Desktop中都是可用的, 所以像这样的代码在两个平台上都可以使用:

import androidx.compose.foundation.ExperimentalFoundationApiimport androidx.compose.foundation.backgroundimport androidx.compose.foundation.combinedClickableimport androidx.compose.foundation.layout.Boximport androidx.compose.foundation.layout.Columnimport androidx.compose.foundation.layout.fillMaxHeightimport androidx.compose.foundation.layout.fillMaxWidthimport androidx.compose.material.Textimport androidx.compose.runtime.getValueimport androidx.compose.runtime.mutableStateOfimport androidx.compose.runtime.rememberimport androidx.compose.runtime.setValueimport androidx.compose.ui.Alignmentimport androidx.compose.ui.Modifierimport androidx.compose.ui.graphics.Colorimport androidx.compose.ui.unit.spimport androidx.compose.ui.window.singleWindowApplicationfun main() = singleWindowApplication {    var count by remember { mutableStateOf(0) }    Box(contentAlignment = Alignment.Center, modifier = Modifier.fillMaxWidth()) {        var text by remember { mutableStateOf("Click magenta box!") }        Column {            @OptIn(ExperimentalFoundationApi::class)            Box(                modifier = Modifier                    .background(Color.Magenta)                    .fillMaxWidth(0.7f)                    .fillMaxHeight(0.2f)                    .combinedClickable(                        onClick = {                            text = "Click! ${count++}"                        },                        onDoubleClick = {                            text = "Double click! ${count++}"                        },                        onLongClick = {                            text = "Long click! ${count++}"                        }                    )            )            Text(text = text, fontSize = 40.sp)        }    }}

combinedClickable只支持主按钮(鼠标左键)和触摸事件. 如果需要以不同方式处理其他按钮, 请看下面的Modifier.onClick(注意: Modifier.onClick目前只适用于Desktop-JVM平台).

鼠标移动监听器

让我们创建一个窗口, 并在其上安装一个指针移动监听器, 根据鼠标指针的位置来改变背景颜色:

import androidx.compose.foundation.backgroundimport androidx.compose.foundation.layout.Boximport androidx.compose.foundation.layout.fillMaxSizeimport androidx.compose.foundation.layout.wrapContentSizeimport androidx.compose.runtime.getValueimport androidx.compose.runtime.mutableStateOfimport androidx.compose.runtime.rememberimport androidx.compose.runtime.setValueimport androidx.compose.ui.Alignmentimport androidx.compose.ui.ExperimentalComposeUiApiimport androidx.compose.ui.Modifierimport androidx.compose.ui.graphics.Colorimport androidx.compose.ui.input.pointer.PointerEventTypeimport androidx.compose.ui.input.pointer.onPointerEventimport androidx.compose.ui.window.singleWindowApplication@OptIn(ExperimentalComposeUiApi::class)fun main() = singleWindowApplication {    var color by remember { mutableStateOf(Color(0, 0, 0)) }    Box(        modifier = Modifier            .wrapContentSize(Alignment.Center)            .fillMaxSize()            .background(color = color)            .onPointerEvent(PointerEventType.Move) {                val position = it.changes.first().position                color = Color(position.x.toInt() % 256, position.y.toInt() % 256, 0)            }    )}

注意, onPointerEvent是实验性的, 将来可能会被改变. 对于更多稳定的API请看Modifier.pointerInput.

鼠标进入监听器

Compose for Desktop 也支持指针的进入和退出处理, 像这样:

import androidx.compose.foundation.backgroundimport androidx.compose.foundation.layout.Arrangementimport androidx.compose.foundation.layout.Columnimport androidx.compose.foundation.layout.fillMaxWidthimport androidx.compose.material.Textimport androidx.compose.runtime.getValueimport androidx.compose.runtime.mutableStateOfimport androidx.compose.runtime.rememberimport androidx.compose.runtime.setValueimport androidx.compose.ui.ExperimentalComposeUiApiimport androidx.compose.ui.Modifierimport androidx.compose.ui.graphics.Colorimport androidx.compose.ui.input.pointer.PointerEventTypeimport androidx.compose.ui.input.pointer.onPointerEventimport androidx.compose.ui.text.font.FontStyleimport androidx.compose.ui.unit.dpimport androidx.compose.ui.unit.spimport androidx.compose.ui.window.singleWindowApplication@OptIn(ExperimentalComposeUiApi::class)fun main() = singleWindowApplication {    Column(        Modifier.background(Color.White),        verticalArrangement = Arrangement.spacedBy(10.dp)    ) {        repeat(10) { index ->            var active by remember { mutableStateOf(false) }            Text(                modifier = Modifier                    .fillMaxWidth()                    .background(color = if (active) Color.Green else Color.White)                    .onPointerEvent(PointerEventType.Enter) { active = true }                    .onPointerEvent(PointerEventType.Exit) { active = false },                fontSize = 30.sp,                fontStyle = if (active) FontStyle.Italic else FontStyle.Normal,                text = "Item $index"            )        }    }}

注意, onPointerEvent是实验性的, 将来可能会被改变. 对于更多稳定的API请看Modifier.pointerInput.

鼠标滚动监听器

import androidx.compose.foundation.layout.Boximport androidx.compose.foundation.layout.fillMaxSizeimport androidx.compose.material.Textimport androidx.compose.runtime.getValueimport androidx.compose.runtime.mutableStateOfimport androidx.compose.runtime.rememberimport androidx.compose.runtime.setValueimport androidx.compose.ui.Alignmentimport androidx.compose.ui.ExperimentalComposeUiApiimport androidx.compose.ui.Modifierimport androidx.compose.ui.input.pointer.PointerEventTypeimport androidx.compose.ui.input.pointer.onPointerEventimport androidx.compose.ui.unit.spimport androidx.compose.ui.window.singleWindowApplication@OptIn(ExperimentalComposeUiApi::class)fun main() = singleWindowApplication {    var number by remember { mutableStateOf(0f) }    Box(        Modifier            .fillMaxSize()            .onPointerEvent(PointerEventType.Scroll) {                number += it.changes.first().scrollDelta.y            },        contentAlignment = Alignment.Center    ) {        Text("Scroll to change the number: $number", fontSize = 30.sp)    }}

注意, onPointerEvent是实验性的, 将来可能会被改变. 对于更多稳定的API请看Modifier.pointerInput.

与Swing的交互操作

Compose for Desktop内部使用Swing, 并允许访问原始AWT事件:

import androidx.compose.foundation.layout.Boximport androidx.compose.foundation.layout.fillMaxSizeimport androidx.compose.material.Textimport androidx.compose.runtime.getValueimport androidx.compose.runtime.mutableStateOfimport androidx.compose.runtime.rememberimport androidx.compose.runtime.setValueimport androidx.compose.ui.Alignmentimport androidx.compose.ui.ExperimentalComposeUiApiimport androidx.compose.ui.Modifierimport androidx.compose.ui.awt.awtEventOrNullimport androidx.compose.ui.input.pointer.PointerEventTypeimport androidx.compose.ui.input.pointer.onPointerEventimport androidx.compose.ui.window.singleWindowApplication@OptIn(ExperimentalComposeUiApi::class)fun main() = singleWindowApplication {    var text by remember { mutableStateOf("") }    Box(        Modifier            .fillMaxSize()            .onPointerEvent(PointerEventType.Press) {                text = it.awtEventOrNull?.locationOnScreen?.toString().orEmpty()            },        contentAlignment = Alignment.Center    ) {        Text(text)    }}

注意, onPointerEvent是实验性的, 将来可能会被改变. 对于更多稳定的API请看Modifier.pointerInput.

在commonMain中通过Modifier.pointerInput监听原生事件

在上面的片段中, 我们使用了Modifier.onPointerEvent, 它是一个辅助函数, 用于订阅某种类型的指针事件. 它是Modifier.pointerInput的一个简短变体. 目前, 它是实验性的, 并且只在桌面上使用(你不能在普通主代码中使用它). 如果你需要在commonMain中订阅事件或者你需要稳定的API, 你可以使用Modifier.pointerInput:

import androidx.compose.foundation.layout.Columnimport androidx.compose.foundation.layout.fillMaxSizeimport androidx.compose.material.Textimport androidx.compose.runtime.mutableStateListOfimport androidx.compose.runtime.rememberimport androidx.compose.ui.Modifierimport androidx.compose.ui.input.pointer.PointerEventTypeimport androidx.compose.ui.input.pointer.pointerInputimport androidx.compose.ui.window.singleWindowApplicationfun main() = singleWindowApplication {    val list = remember { mutableStateListOf<String>() }    Column(        Modifier            .fillMaxSize()            .pointerInput(Unit) {                awaitPointerEventScope {                    while (true) {                        val event = awaitPointerEvent()                        val position = event.changes.first().position                        // on every relayout Compose will send synthetic Move event,                        // so we skip it to avoid event spam                        if (event.type != PointerEventType.Move) {                            list.add(0, "${event.type} $position")                        }                    }                }            },    ) {        for (item in list.take(20)) {            Text(item)        }    }}

新的实验性onClick处理(仅适用于Desktop-JVM平台)

Modifier.onClick为点击, 双击, 长按提供独立的回调. 它只处理源于指针事件的点击, 并且可访问性点击事件不被处理.

每个onClick可以被配置为针对特定的指针事件(使用matcher: PointerMatcher和keyboardModifiers: PointerKeyboardModifiers.() -> Boolean). matcher可以被指定来选择什么鼠标按钮应该触发点击. keyboardModifiers允许过滤有指定keyboardModifiers按下的指针事件.

多个onClick修改器可以被连锁, 以处理不同条件的点击(匹配器和键盘修改器). 与clickable不同, onClick没有默认的Modifier.indication, Modifier.semantics, 当Enter按下时, 它不会触发一个点击事件. 如果有必要, 这些修改器需要单独添加. 最通用的(条件最少的)onClick处理程序应该在其他之前声明, 以确保事件传播的正确性.

import androidx.compose.animation.AnimatedContentimport androidx.compose.animation.ExperimentalAnimationApiimport androidx.compose.foundation.ExperimentalFoundationApiimport androidx.compose.foundation.LocalIndicationimport androidx.compose.foundation.PointerMatcherimport androidx.compose.foundation.backgroundimport androidx.compose.foundation.indicationimport androidx.compose.foundation.interaction.MutableInteractionSourceimport androidx.compose.foundation.layout.Boximport androidx.compose.foundation.layout.Columnimport androidx.compose.foundation.layout.sizeimport androidx.compose.foundation.onClickimport androidx.compose.material.Textimport androidx.compose.runtime.*import androidx.compose.ui.Alignmentimport androidx.compose.ui.ExperimentalComposeUiApiimport androidx.compose.ui.Modifierimport androidx.compose.ui.graphics.Colorimport androidx.compose.ui.input.pointer.PointerButtonimport androidx.compose.ui.input.pointer.isAltPressedimport androidx.compose.ui.input.pointer.isShiftPressedimport androidx.compose.ui.text.style.TextAlignimport androidx.compose.ui.unit.dpimport androidx.compose.ui.window.singleWindowApplication@OptIn(ExperimentalFoundationApi::class, ExperimentalAnimationApi::class)fun main() = singleWindowApplication {    Column {        var topBoxText by remember { mutableStateOf("Click me\nusing LMB or LMB + Shift") }        var topBoxCount by remember { mutableStateOf(0) }        // No indication on interaction        Box(modifier = Modifier.size(200.dp, 100.dp).background(Color.Blue)            // the most generic click handler (without extra conditions) should be the first one            .onClick {                // it will receive all LMB clicks except when Shift is pressed                println("Click with primary button")                topBoxText = "LMB ${topBoxCount++}"            }.onClick(                keyboardModifiers = { isShiftPressed } // accept clicks only when Shift pressed            ) {                // it will receive all LMB clicks when Shift is pressed                println("Click with primary button and shift pressed")                topBoxCount++                topBoxText = "LMB + Shift ${topBoxCount++}"            }        ) {            AnimatedContent(                targetState = topBoxText,                modifier = Modifier.align(Alignment.Center)            ) {                Text(text = it, textAlign = TextAlign.Center)            }        }        var bottomBoxText by remember { mutableStateOf("Click me\nusing LMB or\nRMB + Alt") }        var bottomBoxCount by remember { mutableStateOf(0) }        val interactionSource = remember { MutableInteractionSource() }        // With indication on interaction        Box(modifier = Modifier.size(200.dp, 100.dp).background(Color.Yellow)            .onClick(                enabled = true,                interactionSource = interactionSource,                matcher = PointerMatcher.mouse(PointerButton.Secondary), // Right Mouse Button                keyboardModifiers = { isAltPressed }, // accept clicks only when Alt pressed                onLongClick = { // optional                    bottomBoxText = "RMB Long Click + Alt ${bottomBoxCount++}"                    println("Long Click with secondary button and Alt pressed")                },                onDoubleClick = { // optional                    bottomBoxText = "RMB Double Click + Alt ${bottomBoxCount++}"                    println("Double Click with secondary button and Alt pressed")                },                onClick = {                    bottomBoxText = "RMB Click + Alt ${bottomBoxCount++}"                    println("Click with secondary button and Alt pressed")                }            )            .onClick(interactionSource = interactionSource) { // use default parameters                bottomBoxText = "LMB Click ${bottomBoxCount++}"                println("Click with primary button (mouse left button)")            }            .indication(interactionSource, LocalIndication.current)        ) {            AnimatedContent(                targetState = bottomBoxText,                modifier = Modifier.align(Alignment.Center)            ) {                Text(text = it, textAlign = TextAlign.Center)            }        }    }}

新的实验性onDrag修改器(仅适用于Desktop-JVM平台)

Modifier.onDrag allows for configuration of the pointer that should trigger the drag (see matcher: PointerMatcher).
Many onDrag modifiers can be chained together.

The example below also shows how to access the state of keyboard modifiers (via LocalWindowInfo.current.keyboardModifier) for cases when keyboard modifiers can alter the behaviour of the drag (for example: move an item if we perform a simple drag; or copy/paste an item if dragged with Ctrl pressed)

Modifier.onDrag允许配置应触发拖动的指针(见matcher: PointerMatcher). 许多onDrag修改器可以被连锁起来.

下面的例子还显示了如何访问键盘修改器的状态(通过LocalWindowInfo.current.keyboardModifier), 以应对键盘修改器可以改变拖动行为的情况(例如: 如果我们执行简单的拖动, 则移动一个项目; 如果按住Ctrl拖动, 则复制/粘贴一个项目)

import androidx.compose.foundation.ExperimentalFoundationApiimport androidx.compose.foundation.PointerMatcherimport androidx.compose.foundation.backgroundimport androidx.compose.foundation.gestures.onDragimport androidx.compose.foundation.layout.Boximport androidx.compose.foundation.layout.Columnimport androidx.compose.foundation.layout.offsetimport androidx.compose.foundation.layout.sizeimport androidx.compose.material.Textimport androidx.compose.runtime.getValueimport androidx.compose.runtime.mutableStateOfimport androidx.compose.runtime.rememberimport androidx.compose.runtime.setValueimport androidx.compose.ui.Alignmentimport androidx.compose.ui.ExperimentalComposeUiApiimport androidx.compose.ui.Modifierimport androidx.compose.ui.geometry.Offsetimport androidx.compose.ui.graphics.Colorimport androidx.compose.ui.input.pointer.PointerButtonimport androidx.compose.ui.input.pointer.isCtrlPressedimport androidx.compose.ui.platform.LocalWindowInfoimport androidx.compose.ui.unit.IntOffsetimport androidx.compose.ui.unit.dpimport androidx.compose.ui.window.singleWindowApplication@OptIn(ExperimentalFoundationApi::class)fun main() = singleWindowApplication {    val windowInfo = LocalWindowInfo.current    Column {        var topBoxOffset by remember { mutableStateOf(Offset(0f, 0f)) }        Box(modifier = Modifier.offset {            IntOffset(topBoxOffset.x.toInt(), topBoxOffset.y.toInt())        }.size(100.dp)            .background(Color.Green)            .onDrag { // all default: enabled = true, matcher = PointerMatcher.Primary (left mouse button)                topBoxOffset += it            }        ) {            Text(text = "Drag with LMB", modifier = Modifier.align(Alignment.Center))        }        var bottomBoxOffset by remember { mutableStateOf(Offset(0f, 0f)) }        Box(modifier = Modifier.offset {            IntOffset(bottomBoxOffset.x.toInt(), bottomBoxOffset.y.toInt())        }.size(100.dp)            .background(Color.LightGray)            .onDrag(                enabled = true,                matcher = PointerMatcher.mouse(PointerButton.Secondary), // right mouse button                onDragStart = {                    println("Gray Box: drag start")                },                onDragEnd = {                    println("Gray Box: drag end")                }            ) {                val keyboardModifiers = windowInfo.keyboardModifiers                bottomBoxOffset += if (keyboardModifiers.isCtrlPressed) it * 2f else it            }        ) {            Text(text = "Drag with RMB,\ntry with CTRL", modifier = Modifier.align(Alignment.Center))        }    }}

也有非修改器方式来处理拖拽, 就是用suspend fun PointerInputScope.detectDragGestures:

import androidx.compose.foundation.ExperimentalFoundationApiimport androidx.compose.foundation.PointerMatcherimport androidx.compose.foundation.backgroundimport androidx.compose.foundation.gestures.detectDragGesturesimport androidx.compose.foundation.layout.Boximport androidx.compose.foundation.layout.offsetimport androidx.compose.foundation.layout.sizeimport androidx.compose.material.Textimport androidx.compose.runtime.getValueimport androidx.compose.runtime.mutableStateOfimport androidx.compose.runtime.rememberimport androidx.compose.runtime.setValueimport androidx.compose.ui.Alignmentimport androidx.compose.ui.ExperimentalComposeUiApiimport androidx.compose.ui.Modifierimport androidx.compose.ui.geometry.Offsetimport androidx.compose.ui.graphics.Colorimport androidx.compose.ui.input.pointer.pointerInputimport androidx.compose.ui.unit.IntOffsetimport androidx.compose.ui.unit.dpimport androidx.compose.ui.window.singleWindowApplication@OptIn(ExperimentalFoundationApi::class)fun main() = singleWindowApplication {    var topBoxOffset by remember { mutableStateOf(Offset(0f, 0f)) }    Box(modifier = Modifier.offset {        IntOffset(topBoxOffset.x.toInt(), topBoxOffset.y.toInt())    }.size(100.dp)        .background(Color.Green)        .pointerInput(Unit) {            detectDragGestures(                matcher = PointerMatcher.Primary            ) {                topBoxOffset += it            }        }    ) {        Text(text = "Drag with LMB", modifier = Modifier.align(Alignment.Center))    }}

感谢各位的阅读,以上就是“Compose for Desktop鼠标事件源码分析”的内容了,经过本文的学习后,相信大家对Compose for Desktop鼠标事件源码分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Compose for Desktop鼠标事件源码分析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Compose for Desktop鼠标事件源码分析

这篇文章主要讲解了“Compose for Desktop鼠标事件源码分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Compose for Desktop鼠标事件源码分析”吧!鼠标事件监
2023-07-05

Compose for Desktop 鼠标事件示例demo

这篇文章主要为大家介绍了Compose for Desktop 鼠标事件示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-03-19

Java中MouseWheelListener的鼠标滚轮事件分析

本篇内容主要讲解“Java中MouseWheelListener的鼠标滚轮事件分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中MouseWheelListener的鼠标滚轮事件分析”
2023-06-21

vue事件修饰符源码分析

本篇内容主要讲解“vue事件修饰符源码分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue事件修饰符源码分析”吧!在项目开发中遇到了vue的键盘事件,以下是项目的代码片段:
2023-07-05

AndroidViewGroup事件分发和处理源码分析

这篇文章主要为大家介绍了AndroidViewGroup事件分发和处理源码分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-02-14

【Android】事件分发机制源码解析

文章目录1. 分发顺序2.源码分析2.1 Activity中的分发流程dispatchTouchEventonTouchEvent总结2.2 ViewGroup中的分发流程dispatchTouchEventonInterceptTouch
2022-06-06

Windows 8技巧:Windows 8常用鼠标事件 分析介绍

在Windows 8中采用一些新的鼠标事件以替代以前Silverlight的鼠标事件,其常用事件如下:PointerWheelChanged:鼠标中键滑动事件。PointerPressed:鼠标点击下去的时候即触发事件。PointerRel
2022-06-04

React实现合成事件的源码分析

React 中的事件,是对原生事件的封装,叫做合成事件。抽象出一层合成事件,是为了做兼容,抹平不同浏览器之间的差异。本文将从事件绑定和事件触发角度,带大家解读下源码,感兴趣的可以了解一下
2022-12-08

Vue组件中的自定义事件源码分析

这篇文章主要介绍“Vue组件中的自定义事件源码分析”,在日常操作中,相信很多人在Vue组件中的自定义事件源码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue组件中的自定义事件源码分析”的疑惑有所帮助!
2023-06-29

Android源码分析——ViewGroup的事件分发机制(二)

通过前一篇博客View的事件分发机制,从dispatchTouchEvent说起(一)的介绍相信大家对 Android View 事件的分发机制有了很深的理解。我们知道 Android 中 View 是存在于 Activity。 今天我们继
2022-06-06

Laravel中的事件溯源实例代码分析

这篇文章主要介绍了Laravel中的事件溯源实例代码分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Laravel中的事件溯源实例代码分析文章都会有所收获,下面我们一起来看看吧。我们将新建一个 Laravel
2023-07-04

Android点击事件派发机制源码分析

概述 一直想写篇关于Android事件派发机制的文章,却一直没写,这两天刚好是周末,有时间了,想想写一篇吧,不然总是只停留在会用的层次上但是无法了解其内部机制。我用的是4.4源码,打开看看,挺复杂的,尤其是事件是怎么从Activity派发出
2022-06-06

深入分析React源码中的合成事件

合成事件不是浏览器本身触发的事件,自己创建和触发的事件。本文将从源码角度带大家一起深入了解下React中的合成事件,需要的可以参考一下
2022-11-13

Python selenium的基本元素与键盘鼠标模拟事件实例分析

本篇内容主要讲解“Python selenium的基本元素与键盘鼠标模拟事件实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python selenium的基本元素与键盘鼠标模拟事件实例分
2023-07-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录