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为单位)(限配置事件)。

  • 相关阅读:
    Validation failed for one or more entities. See 'EntityValidationErrors' property for more details
    Visual Studio断点调试, 无法监视变量, 提示无法计算表达式
    ASP.NET MVC中MaxLength特性设置无效
    项目从.NET 4.5迁移到.NET 4.0遇到的问题
    发布网站时应该把debug设置false
    什么时候用var关键字
    扩展方法略好于帮助方法
    在基类构造器中调用虚方法需谨慎
    ASP.NET MVC中商品模块小样
    ASP.NET MVC中实现属性和属性值的组合,即笛卡尔乘积02, 在界面实现
  • 原文地址:https://www.cnblogs.com/dufu-csdn/p/dufu_13.html
Copyright © 2011-2022 走看看