event参数详解

官方解释:

Event 对象代表事件的状态,比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态。 事件通常与函数结合使用,函数不会在事件发生前被执行!

event是事件的参数啊!在event中包含了事件触发时的参数,比如click事件的event中包含着.e.pageX,e.pageY,keydown事件中包含着ev.keyCode等,在ie中,event是全局的可以通过window.event来获取,在其他浏览器中都是作为参数传入的。 
所以好多事件函数都是这样写: 
mydiv.onclick = function(ev){ 
if(!ev){ev = window.event;} //这句也可以简写成:ev=window.event||ev; 
alert(ev.pageX+”,”+ev.pageY); 
}

以下部分 转载自其它博文,点击这里进行跳转

如果没有传入event作为参数,在函数内部如何获取event呢?

js对于函数的定义是非常松,即使你在函数定义时未写任何参数,或者你定义的参数有多个,但是你调用时,一个参数也不填,也不会出错的。 
因为js函数内默认有个变量,保存你的入参叫:arguments, 
他是一个数组,下标从0开始, 
所以获取event可以写成

function eventTest(){
    var event = window.event||arguments[0];
    //target 就是这个对象
    target = event.srcElement||event.target,
    //这个对象的值
    targetValue = target.value;
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

当然,有的时候需要给函数传入几个参数,这时如果要用想用到event的话可以这么写

function eventTest(a,b){
    var event = window.event || arguments.callee.caller.arguments[0]
    //target 就是这个对象
    target = event.srcElement||event.target,
    //这个对象的值
    targetValue = target.value;
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

如果传入了参数却如第一种写法的话,则arguments中将会传入传入的参数,这时获取的arguments[0]就会是第一个传入的参数了。

鉴于此,故还是都用第二中方法获取更为稳妥。

<think>好的,用户想了解Python Tkinter中event参数在绘图函数中的作用和原理。首先,我需要回顾一下之前的历史对话,确保回答的一致性。用户之前询问过关于start_drawing函数中的event参数,特别是global变量和坐标记录的部分,现在他们希望更深入理解event参数本身。 首先,用户提到了引用内容,其中提到了事件绑定、事件对象属性以及自定义事件。需要将这些信息整合到当前的回答中。根据引用,event参数是由Tkinter传递的事件对象,包含触发事件的信息,比如鼠标位置、按键状态等。 接下来,我需要解释event参数在绘图中的具体作用。比如,在鼠标事件中,event.x和event.y提供了当前鼠标的坐标,这对于绘制线条或形状至关重要。此外,可能需要提到不同的事件类型,如<ButtonPress-1>、<B1-Motion>等,以及它们如何被绑定到处理函数上。 用户可能还想知道事件处理的基本流程,从事件绑定到回调函数的执行,以及事件对象如何在这些步骤中传递信息。需要强调event参数作为回调函数的参数,自动由Tkinter传入,包含事件发生时的上下文信息。 另外,用户之前的回答中提到了全局变量用于存储坐标,可能需要提到使用类来替代全局变量,如引用中的Application类示例,这样更符合良好的编程实践。同时,引用中提到的自定义事件可能不太相关,但可以简要说明,以展示event参数的灵活性。 需要确保回答结构清晰,分点说明,涵盖事件参数的结构、工作原理、在绘图中的具体应用,以及可能的优化方法。最后,生成相关问题时要结合用户之前的问题,比如避免全局变量、坐标系差异和分辨率处理,同时可能扩展事件处理的其他方面,如多设备兼容性或高级事件绑定。 在回答中要注意使用正确的中文术语,避免技术术语混淆,并确保LaTeX格式的正确应用,如坐标变量使用$...$包裹。同时,引用用户提供的引用文献,比如引用[1]到[4],来支持各个部分的解释,增强回答的可信度。 最后,检查是否有遗漏的重要点,比如事件对象的其他属性(如char表示按键字符,state表示修饰键状态),或者不同事件类型的具体应用场景。确保回答全面且易于理解,帮助用户构建完整的知识框架。</think>在Python Tkinter中,`event`参数是事件处理的核心对象,尤其在绘图功能中承担**坐标传递、状态记录和交互响应**的关键角色。以下是其作用原理的分层解析: --- ### 一、事件参数的核心作用 1. **坐标信息载体** - `event.x`/`event.y`:记录事件触发时鼠标在画布上的像素坐标$(x,y)$,例如: ```python def on_click(event): print(f"点击坐标: ({event.x}, {event.y})") # 输出如 (150, 200) ``` - **绘图依赖**:通过连续捕获`<B1-Motion>`事件中的坐标,实现线条轨迹绘制[^1]。 2. **事件类型标识** - 通过事件字符串(如`"<Button-1>"`表示左键点击)区分不同操作: ```python canvas.bind("<Button-1>", start_drawing) # 左键按下触发 canvas.bind("<B1-Motion>", drawing) # 左键拖拽触发 ``` 3. **设备状态传递** - `event.state`:存储修饰键状态(如Shift/Ctrl的二进制组合值)[^3] - `event.num`:标识鼠标按键编号(如滚轮中键为2)[^3] --- ### 二、事件驱动绘图的工作流程 1. **事件绑定与回调** - 通过`widget.bind()`将事件类型与处理函数关联: ```python canvas.bind("<Button-1>", start_drawing) # 绑定左键点击事件 ``` - 触发时Tkinter自动生成`Event`对象并传递给回调函数[^1]。 2. **坐标连续性维护** - 示例代码分析: ```python def start_drawing(event): global last_x, last_y last_x, last_y = event.x, event.y # 记录起始坐标 def drawing(event): canvas.create_line(last_x, last_y, event.x, event.y) # 连线 last_x, last_y = event.x, event.y # 更新坐标锚点 ``` - **原理**:通过全局变量跨事件传递坐标,形成连贯绘图路径[^2]。 3. **坐标系映射** - 原点(0,0)位于画布左上角,向右为$x$轴正方向,向下为$y$轴正方向 - 坐标单位为像素,与屏幕分辨率直接相关[^3]。 --- ### 三、优化替代方案(避免全局变量) 参考引用[2]的类封装方法: ```python class DrawingApp(Frame): def __init__(self, master=None): super().__init__(master) self.last_x, self.last_y = 0, 0 # 使用实例变量替代全局变量 def start_drawing(self, event): self.last_x, self.last_y = event.x, event.y def drawing(self, event): self.canvas.create_line(self.last_x, self.last_y, event.x, event.y) self.last_x, self.last_y = event.x, event.y ``` - **优势**:通过面向对象编程实现状态隔离,提升代码可维护性[^2]。 --- ### 四、与其他GUI框架的对比 | 特性 | Tkinter Event | Pygame Event | PyQt QEvent | |--------------------|-----------------------------|----------------------------|----------------------------| | **坐标系统** | 画布相对坐标 | 窗口相对坐标 | 局部/全局坐标双体系 | | **事件传递方式** | 回调函数显式绑定 | 事件队列轮询 | 信号槽机制 | | **修饰键检测** | `event.state`二进制位掩码 | `pygame.key.get_mods()` | `QKeyEvent::modifiers()` | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值