# Linking Events to Callback Functions
我不会尝试完全解释Tk和Tkinter的事件绑定。 我已经读过几本书和许多有关该主题的网页,但感觉不太熟练。
将事件绑定到小部件是使用Tk和Tkinter的一个非常令人困惑的方面。 Tk实现了全局绑定层次结构,因为Tk允许在操作之间创建绑定,并且
1. 特定小部件内的事件,例如鼠标选择和特定按钮,
2. 特定类别的小部件内的事件,例如鼠标选择和应用程序中的所有按钮,
3. 顶层窗口中所有窗口小部件中的事件,以及
4. 应用程序中所有小部件内的事件。
PAGE实际上仅辅助第一种绑定。 至少一位受人尊敬的文档撰写者建议不要使用其他三篇。 如果您觉得有必要对绑定进行分类,则可以将其手动添加到支持模块中的“ init”功能中。
Grayson在他的书中谈到了直接或间接调用回调。 指定命令属性将导致间接调用,而指定绑定命令将导致直接调用。 不同之处在于,直接调用将事件对象传递给回调,并且回调函数必须具有包含该事件参数的参数列表。 要查看直接和间接调用回调的示例,请参见vrex示例或bind示例。 人们还可以将它们描述为清晰而混乱,或者简单而复杂。 首先让我讨论一种简单的情况,即指定命令属性。
许多小部件都有一个command属性,该属性指定了用Button-1选择小部件时要执行的代码。 对于使用Button-1选择小部件的常见情况,这是一种简化的绑定方式。 虽然Tk允许指定一个代码块,但必须坚持使用Python中的函数调用。 例如,将按钮的命令属性设置为“ foo”,以便选择Button-1将导致不带参数的函数“ foo”的调用。
如果要调用一个函数并将参数传递给它,则可以使用lambda表达式。 请参阅Grayson的书第6.4节,详细了解在这种情况下使用lambda表达式。 (简而言之,如果Python遇到后跟括号的函数名称,它将尝试立即执行该函数,而在事件发生时则需要执行。)假设您要调用函数foo并将其3传递给 一个参数,您作为命令输入的是
~~~
lambda : foo(3)
~~~
不是
~~~
foo(3)
~~~
或传递可变参数
~~~
lambda x: foo(x)
~~~
不是
~~~
foo(x)
~~~
要指定这样的命令,请选择一个小部件,然后在“属性编辑器”中的“命令”字段中输入该命令。 为了保持具有完成大多数事情的太多方式的Virtual Tcl风格,一种替代方法是使用Button-3在Widget Tree中选择Widget,然后选择Widget-> Set Command。 我不经常使用替代方法。 除了这一段之外,我可能会忘记它。
当指定Entry小部件或Tk_entry小部件的“ validatecommand”和“ invalidcommand”选项时,命令字符串必须是一个元组,第一个元素是命令名称,其他元素限于:
* %d = 动作类型(1 =插入,0 =删除,其他为-1)
* %i =要插入/删除的char字符串的索引,或-1
* %P = 条目的值(如果允许编辑)
* %s = 编辑前的输入值
* %S = 插入或删除的文本字符串(如果有)
* %v =当前设置的验证类型
* %V = 触发回调的验证类型
(key, focusin, focusout, forced)
* %W = 小部件的tk名称
每个元素都用引号引起来。 例如:
~~~
(vcmd, '%P', '%S', '%W')
~~~
因此,将发生的情况是,PAGE函数将在支持模块中由PAGE创建一个骨架函数vcmd,其中可变数量的参数以entry的值作为第一个参数,插入的字符串作为第二个参数,而widget信息作为第三个参数。 请注意,%W不会传递小部件,而是将小部件转换为字符串。 我认为这是tkinter中的错误。 在tkinter中,它的行为肯定不同于在Tcl / Tk中的行为。
骨架函数如下所示:
~~~
def vcmd(*args):
print('v2_support.vcmd')
for arg in args:
print ('another arg:', arg)
sys.stdout.flush()
return True
~~~
请注意,验证函数必须返回True或False。
简单案例的绑定就这么多了,该案例本质上定义了一个配置命令,用于在生成的Python中设置小部件的command属性。为了将其他事件绑定到窗口小部件,我将指向构建窗口的Bindings窗口。当然,可以在支持模块的init功能中手动编码bind命令。
对于许多小部件而言,command属性是必经之路,并且很容易将视为关联的事件。实际上,是关联的事件。差异可能很重要。例如,“复选框”窗口小部件将关联变量设置为新值,作为事件的最后一步。
另一个建议是,虽然command属性通常会传递零个参数或lambda函数中指定的参数。对于Scale和TScale小部件,将scale的最终值作为第一个参数传递给回调函数。看到[Scale and TScale](use.md) ⭸Ɵ 耀 I ⭸Ɵ 耀 ⭸Ɵ 耀 0 2 ⭸Ɵ 耀 Iዀ戻翽 ue m'd 翽 闠㩏Ɵ 鈈㩏Ɵ 醀㩏Ɵ 娈戾翽 Ā Ũ 㬀㢾Ɵ 㲰戹翽 ዀ戻翽 詨㩏Ɵ 搘㩏Ɵ 諰㩏Ɵ ૽Ɵ ⭸Ɵ 耀 ⭸Ɵ ⭸Ɵ 灐ჀƟ 镘㩏Ɵ 晈㩏Ɵ 铐㩏Ɵ ⭸Ɵ �⭸Ɵ Ɵ ૽Ɵ ⭸Ɵ 耀 灐ჀƟ 翽 環ჀƟ 㲰戹翽 Ɵ Ɵ 挈㩏Ɵ mo⭸Ɵ 耀巸ଯƟ mo⭸Ɵ 耀ᘐ mo⭸Ɵ 耀 Ɵ mo⭸Ɵ 耀 mousemove ⭸Ɵ 耀 Ɵ mo⭸Ɵ 耀 md).
- 介绍
- 更新记录
- X Concepts
- Visual Tcl
- 使用PAGE设计范例
- 项目目录配置
- Python 2 or Python 3
- Python编码和UTF-8
- 使用PAGE的简短说明
- PAGE的状态
- 安装
- PAGE界面
- 主菜单
- 子菜单
- 组件工具栏
- 属性编辑器
- 组件树
- 绑定操作窗口
- 菜单编辑器
- 首选项窗口
- Python控制台
- 回调窗口
- 应用窗口
- 颜色对话框
- 颜色
- 双显示器
- 默认值和首选项
- Preferences Windows
- Color Preferences
- Font Preferences
- 模块结构
- 风格和主题
- 使用PAGE
- 命名约定
- 概述
- Toplevel Geometry
- 别名
- 气球帮助-工具提示
- 选择和修改组件
- 修改组件位置和尺寸
- 锁定组件
- 填充容器
- 剪切,复制和粘贴
- Stash and Apply - Propagate Widget Options
- 菜单组件
- 回调函数
- 将事件链接到回调函数
- 创建绑定
- 为滚动组件创建绑定
- 定义回调函数
- 查看回调
- 指定字体
- Toplevel Widget
- 相对位置
- Tkinter变量类
- Ttk Widgets
- Scrolled Widgets
- Ttk Notebook and PNotebook
- Ttk Panedwindow
- Ttk Treeview
- Entry
- Ttk Entry
- Ttk Combobox
- Radiobuttons
- 文本和变量的奇异性
- Label
- Listbox
- Spinbox
- Scale and TScale
- TSeparator
- Sizegrip
- Custom Widgets
- Canvas
- 生成,检查和运行Python GUI
- 创建和保存代码模块
- 检查生成的Python模块
- 执行Python模块
- 将生成的Python模块加载到IDE中
- 具有多个顶级Windows的应用程序
- 修改光标
- 使用图像
- 动态组件
- 菜单
- 重建
- 自动更新支持模块
- 重用
- 模板
- 从现有项目中借用组件
- 范例
- 结语