当前位置:   article > 正文

[Tkinter 教程15] event 事件绑定_python tkinter 绑定方法

python tkinter 绑定方法

一、简介

        一个 Tkinter 应用生命周期中的大部分时间都处在一个消息循环 (event loop) 中. 它等待事件的发生: 事件可能是 按键按下, 鼠标点击, 鼠标移动 等.
        Tkinter 提供了用以处理相关事件的机制. 处理函数可以被绑定给各个控件的各种事件.
        widget.bind(event, handler)
        如果相关事件发生, handler 函数会被触发, 事件对象 event 会传递给 handler 函数.

#!/usr/bin/python3
# write tkinter as Tkinter to be Python 2.x compatible
from tkinter import *
def hello(event):
    print("Single Click, Button-l") 
def quit(event):                           
    print("Double Click, so let's stop") 
    import sys; sys.exit() 

widget = Button(None, text='Mouse Clicks')
widget.pack()
widget.bind('Button-1', hello)
widget.bind('Double-1', quit) 
widget.mainloop()

        让我们再写一个例子, 用以处理上面提到的鼠标在控件内移动的事件:

from tkinter import *

def motion(event):
  print("Mouse position: (%s %s)" % (event.x, event.y))
  return

master = Tk()
whatever_you_do = "Whatever you do will be insignificant, but it is very important that you do 
it.\n(Mahatma Gandhi)"
msg = Message(master, text = whatever_you_do)
msg.config(bg='lightgreen', font=('times', 24, 'italic'))
msg.bind('Motion',motion)
msg.pack()
mainloop()


二、事件:对刺激做出反应

        事件是应用程序中发生的事件(例如,用户按下某个键或单击或拖动鼠标),应用程序需要对其做出反应。

        小部件通常有很多内置行为。例如,按钮将通过调用其回调来对鼠标单击做出反应command。再例如,如果将焦点移至条目小部件并按字母,该字母就会添加到小部件的内容中。

        但是, Tkinter 的事件绑定功能允许您添加、更改或删除行为。

        首先,一些定义:

  • 事件是您的应用程序需要了解的某些事件 

  • 事件处理 程序是应用程序中的一个函数,当事件发生时会调用该函数。

  • 当您的应用程序设置一个事件处理程序时, 我们将其称为绑定,该事件处理程序在小部件发生事件时被调用54. Events: responding to stimuli

三、鼠标和键盘事件

        Tkinter 使用所谓的 事件队列 (event sequences) 暴露接口以绑定 handler 到相关事件. 事件以字符串的形式给出:

modifier-type-detail

  type 字段是一个事件的关键字段. modifer 和 detail 字段则不是必要字段, 很多情况下这两个字段都不会被赋值. 这两个字段用以提供 type 所代表的事件的附加信息. type 字段描述事件种类, 比如 鼠标点击, 键位按下, 控件获得焦点 等.

EventDescription
Button某个鼠标按键在控件上被点击. detail 指定了哪一个按键被点击了, 比如, 鼠标左键点击为 Button-1, 鼠标中键点击为 Button-2, 鼠标右键点击为 Button-3, 向上滚动滑轮为 Button-4, 向下滚动滑轮为 Button-5. 如果在控件上按下鼠标的某个键并保持按下, Tkinter 将"抓住"该事件. 之后的鼠标事件, 比如 鼠标移动 或 鼠标按键释放 事件, 会被自动发送给该控件处理, 即使鼠标移动出该控件时依然如此. 鼠标相对当前控件的位置会被存储在 event 对象中的 x 和 y 字段中传递给回调函数.
Motion鼠标在某个按键被按下时的移动事件. 鼠标左键点击为 B1-Motion, 鼠标中键点击为 B2-Motion, 鼠标右键点击为 B3-Motion. 鼠标相对当前控件的位置会被存储在 event 对象中的 x 和 y 字段中传递给回调函数.
ButtonRelease按钮点击释放事件. 鼠标左键点击为 ButtonRelease-1, 鼠标中键点击为 ButtonRelease-2, 鼠标右键点击为 ButtonRelease-3. 鼠标相对当前控件的位置会被存储在 event 对象中的 x 和 y 字段中传递给回调函数.
Double-Button鼠标双击事件. 鼠标左键点击为 Double-Button-1, 鼠标中键点击为 Double-Button-2, 鼠标右键点击为 Double-Button-3. Double 和 Triple 都可以被用作前缀. 注意: 如果同时绑定单击事件 (Button-1) 和双击事件 (Double-Button-1), 则两个回调都会被调用.
Enter鼠标移入控件事件. 注意: 这个事件不是 Enter 键按下事件, Enter 按下事件是 Return.
Leave鼠标移出控件事件.
FocusIn控件或控件的子空间获得键盘焦点.
FocusOut控件丢失键盘焦点 (焦点移动到另一个控件).
ReturnEnter 点击事件. 键盘上的所有键位都可以被绑定. 特殊键位名称包括 Cancel, BackSpace, Tab, Return (Enter), Shift_L (任意 Shift), Control_L (任意 Control), Alt_L (任意 Alt), Pause, Caps_Lock, Escape, Prior (Page Up), Next (Page Down), End, Home, Left, Up, Right, Down, Print, Insert, Delete, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, Num_Lock, and Scroll_Lock
Key键盘按键点击事件. 键值被存储在 event 对象中传递. (特殊键位会传递空键值).
a"a" 键被点击. 其他字符也可以如此定义. 特殊情况包括 空格 (space) 和 小于号 (less). 注意 "1" 是绑定键盘键位, 而 1 则是按钮绑定.
Shift-Up在 shift 被按下时点击 up 键. 同样的, 也有 Alt-Up, Control-Up 事件.
Configure控件大小改变事件. 新的控件大小会存储在 event 对象中的 width 和 height 属性传递. 有些平台上该事件也可能代表控件位置改变.

四、bind(结合)的水平

        您可以将处理程序绑定到三个级别中任意级别的事件:

4.1 实例绑定:

        您可以将事件绑定到一个特定的小部件。例如,您可以将 画布小部件中的PageUp键绑定到使画布向上滚动一页的处理程序。要绑定小部件的事件,请调用.bind()该小部件上的方法(请参阅第 26 节“通用小部件方法”)。

例如,假设您有一个名为 的画布小部件 self.canv,并且您希望每当用户单击鼠标按钮 2(中间按钮)时在画布上绘制一个橙色斑点。要实现此行为:

self.canv.bind('<Button-2>', self.__drawOrangeBlob)

第一个参数是一个序列描述符,它告诉Tkinter每当鼠标中键按下时,就会调用名为 的 事件处理self.__drawOrangeBlob程序。(请参阅下面第 54.6 节“编写处理程序:Event 类”,了解如何编写处理程序(例如 )的概述.__drawOrangeBlob())。请注意,您省略了处理程序名称后面的括号,以便 Python 将传递处理程序的引用,而不是立即尝试调用它。

4.2 类绑定:

        您可以将事件绑定到类的所有小部件。例如,您可以将所有小部件设置Button为通过在英语和日语标签之间来回更改来响应鼠标中键单击。要将事件绑定到类的所有小部件,请调用.bind_class()任何小部件上的方法(请参阅上面的第 26 节“通用小部件方法”)。

        例如,假设您有多个画布,并且您希望将鼠标按钮 2 设置为在其中任意画布上绘制橙色斑点。您不必调用 .bind()其中的每一个,而是可以通过一次调用将它们全部设置起来,如下所示:

self.bind_class('canvas', '<Button-2>', self.__drawOrangeBlob)

4.3 应用程序绑定:

        您可以设置绑定,以便无论哪个小部件具有焦点或位于鼠标下方,某个事件都会调用处理程序。例如,您可以将PrintScrn键绑定到应用程序的所有小部件,以便无论哪个小部件获取该键,它都会打印屏幕。要在应用程序级别绑定事件,请 .bind_all()在任何小部件上调用该方法(请参阅第 26 节“通用小部件方法”)。

        以下是绑定 PrintScrn键的方法,其“键名称”为'Print'

self.bind_all('<Key-Print>', self.__printScreen)

五、事件序列

        Tkinter有一个强大且通用的方法,允许您准确定义要绑定到处理程序的特定事件和通用事件。

        一般来说,事件序列是包含一个或多个事件模式的字符串。每个事件模式描述了一件可能发生的事情。如果序列中有多个事件模式,则仅当所有模式都在同一序列中发生时才会调用处理程序。

        事件模式的一般形式是:

<[ modifier-]... type[- detail]>
  • 整个图案都包含在里面<…>

  • 事件类型描述事件的一般类型,例如按键或鼠标单击。请参见第 54.3 节“事件类型”

  • 您可以 modifier 在类型之前添加可选项目以指定组合,例如在按下其他按键或单击鼠标时按下 Shift或 Control键。第 54.4 节 “事件修饰符”

  • 您可以添加可选detail项目来描述您要查找的键或鼠标按钮。对于鼠标按钮,按钮 1 为 1,按钮 2 为 2,按钮 3 为 3。

    • 通常的设置是按钮 1 位于左侧,按钮 3 位于右侧,但左撇子可以交换这些位置。

    • 对于键盘上的按键,这是按键的字符(对于单字符按键,如 或A*)或按键的名称; 有关所有键名称的列表 ,请参见第 54.5 节“键名称” 。

以下是一些示例,可让您了解事件模式的特色:

<Button-1>用户按下了第一个鼠标按钮。
<KeyPress-H>用户按下了 H 键。
<Control-Shift-KeyPress-H>用户按下了control-shift -H。
参考文章系列:
[译][Tkinter 教程01] 入门: Label 控件
[译][Tkinter 教程02] Message 控件
[译][Tkinter 教程03] Button 控件
[译][Tkinter 教程04] Variable 类
[译][Tinkter 教程05] Radiobutton 控件
[译][Tkinter 教程06] Checkbox 控件
[译][Tkinter 教程07] Entry 控件
[译][Tkinter 教程08] Canvas 图形绘制
[译][Tkinter 教程09] Scale 控件
[译][Tkinter 教程10] Text 控件
[译][Tkinter 教程11] 对话框和消息框
[译][Tkinter 教程12] 布局管理 (Pack Place Grid)
[译][Tkinter 教程13] Mastermind 游戏
[译][Tkinter 教程14] menu 菜单
[译][Tkinter 教程15] event 事件绑定

  参考资料
. Lyux - SegmentFault 思否

python - Move and zoom a tkinter canvas with mouse - Stack Overflow

已获原作者授权. 原系列地址: Python Tkinter

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/124963?site
推荐阅读
相关标签
  

闽ICP备14008679号