zoukankan      html  css  js  c++  java
  • 程序猿使用Python的tkinter库进行GUI编程肯定要会的事件处理

    事件类型
    用户通过鼠标、键盘、游戏控制设备在与图形界面交互时,就会触发事件。tkinter事件通常采用了将事件名称放置于尖括号内的字符串表示,尖括号中的内容我们称之为事件类型。事件类型有其通用的定义方式。如下

    <[modifier-]…type[-detail]>

    其中方括号内的内容为可选参数

    modifier为组合键的定义,例如,同时按下Ctrl键;

    type为通用类型,例如,键盘按键(KeyPress)

    detail用于具体信息,如按下键盘中‘B’键

    常用事件类型如下:

    【鼠标单击事件】
    <Button-1 >:单击鼠标左键
    <Button-2>:单击鼠标中间键(如果有)
    <Button-3>:单击鼠标右键
    <Button-4>:向上滚动滑轮
    <Button-5>:向下滚动滑轮

    【鼠标双击事件】
    <Double-Button-1>:鼠标左键双击
    <Double-Button-2>:鼠标中键双击
    <Double-Button-3>.:鼠标右键双击

    【鼠标释放事件】
    <ButtonRelease-1>:鼠标左键释放
    <ButtonRelease-2>:鼠标中键释放
    <ButtonRelease-3>:鼠标右键释放

    【鼠标按下并移动事件(即拖动)】
    <B1-Motion>:左键拖动
    <B2-Motion>:中键拖动
    <B3-Motion>:右键拖动

    【鼠标其他操作】
    <Enter>:鼠标进入控件(放到控件上面)
    <FocusIn>:控件获得焦点
    <Leave>:鼠标移出控件
    <FocusOut>:控件失去焦点

    【键盘按下事件】
    <Key>:键盘按下,事件event中的keycode,char都可以获取按下的键值
    <Return>:键位绑定,回车键,其它还有<BackSpace>,<Escape>,<Left>,<Up>,<Right>,<Down>等等

    【控件属性改变事件】
    <Configure>:控件大小改变,新的控件大小会存储在事件event对象中的 width 和 height 属性传递,部分平台上该事件也代表控件位置改变。

    【组合使用】
    <Control-Shift-Alt-KeyPress-A>:同时按下Ctrl+Shift+Alt+A等4个键
    <KeyPress-A>:按下键盘中的’A’键
    游戏设备使用参见设备供应商提供的API函数,这里不再赘述,常用的事件类型就是这些了。大家没有必要全部记住,这些事件都是一种类英文的描述,只要记住主要的几个,按照<[modifier-]…type[-detail]>进行组合就可以了。

    事件绑定
    常见的事件绑定有以下几类
    【创建组件对象实例时指定】

    创建组件对象实例时,可以通过其命名参数command指定事件处理函数,如为Button控件绑定单击时间,当控件被单击时执行clickhandler函数处理

    b = Button(root, text='按钮', command=clickhandler)
    1
    【实例绑定】

    调用组件对象实例方法bind,可以为指定组件实例绑定事件

    w.bind('<event>', eventhandler, add='')
    1
    其中,<event>为事件类型,eventhandler为事件处理函数,可选参数add默认为’’,表示事件处理函数替代其他绑定,如果为‘+’,则加入事件处理队列。

    如绑定组件对象,使得Canvas组件实例c可以处理鼠标右键单击事件(处理函数名称为eventhandler),代码如下:

    c=Canvas(); c.bind('Button-3', eventhandler)
    1
    【类绑定】

    调用组件对象实例方法bind_class函数,可以为特定类绑定事件

    w.bind_class('Widget', '<event>', eventhandler, add='')
    1
    其中,Widget为组件类;<event>为事件;eventhandler为事件处理函数

    如绑定组件类,使得所有Canvas组件实例可以处理鼠标中键事件(事件处理函数为eventhandler)

    c = Canvas(); c.bind_class('Canvas', '<Button-2>', eventhandler)
    1
    【程序界面绑定】

    调用组件对象实例方法bind_all函数,可以为所有组件类型绑定事件

    w.bind_all('<event>', eventhandler, add='')
    1
    同上,其中<event>为事件;eventhandler为事件处理函数

    如将PrintScreen键与程序中所有组件对象绑定,使得程序界面能处理打印屏幕的键盘事件

    c = Canvas(); c.bind('<Key-Print>', printscreen)
    1
    事件处理函数的编写

    【定义事件函数和事件方法】

    对于能通过command传入的函数,其参数没有必须指定第一个参数为event的要求。但是通过bind(含bind_class、bind_all,当然,bind_class第一个参数为className,但其后必须是Event实例)绑定的事件,在定义函数方法时(事件处理可以定义为函数,也可以定义为对象的方法),两者都带一个参数event。触发事件调用处理函数时,将传递Event对象实例。

    函数定义
    def handlerName(event):
    1
    函数内容

    类中定义
    def handlerName(self, event):
    1
    方法内容

    【Event事件对象参数属性】

    通过传递Event事件对象的属性,可以获取相关参数备程序使用。常用的Event事件参数有以下几种。

    widget:产生该事件的控件
    x, y:当前鼠标位置
    x_root, y_root:当前鼠标相对于屏幕左上角(0,0)的位置,以像素px为单位。
    char:字符代码(限键盘事件),作为字符串返回
    keysym:关键符号(限键盘事件)
    keycode:关键代码(限键盘事件)
    num:按钮号码(限鼠标按钮事件)
    width, height:小部件的新大小(以像素px为单位)(限配置事件)。

  • 相关阅读:
    构造 非构造 代码块
    Random 类生成随机数
    JAVA寄存器
    PyCharm配置远程python解释器和在本地修改服务器代码
    Java实现常见的排序算法
    推荐系统冷启动问题解决方案
    AVL树C代码
    AVL树->图解2
    AVL树->图解1
    二叉查找树(Binary Sort Tree)
  • 原文地址:https://www.cnblogs.com/dufu-csdn/p/dufu_13.html
Copyright © 2011-2022 走看看