多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
### Bindings Window 有许多事件可以链接到代码。 请参见Tk手册页和Grayson的第6章。 它们包括响应不同的鼠标按钮的按下或释放,获得或失去焦点的窗口等以及虚拟事件。 Bind是用于将这些事件之一链接到代码的命令,可以通过使用“绑定窗口”来完成。 这里的代码必须是lambda表达式,因为它会将包含很多有用信息的事件对象传递给回调。 因此,回调函数的参数列表中必须具有事件参数。 可以通过使用Button-3选择窗口小部件并从弹出菜单中选择“绑定...”来打开“绑定”窗口。 基本上, 1. 如果尚未选择左栏中的小部件, 2. 从插入菜单中插入所需的事件, 3. 选择左栏中的项目,然后 4. 在右侧栏中填写原型Lambda表达式。 可以从弹出菜单中打开“绑定”窗口,以响应使用Button-3选择小部件或使用Button-1选择小部件并键入Alt-b。 然后从菜单中选择“插入”以将事件置于左侧窗格中。 最后,在将显示模板的右窗格中插入所需的代码。 让我们澄清一下,再看看 ![](https://img.kancloud.cn/78/53/78536946b7330ce4f111a89a938f7d91_672x600.png) 在左列中,您将看到所选窗口小部件的Tcl名称,并在该名称的下方看到一个列表,最初没有已绑定到该窗口小部件的事件。 在图像中,已经绑定了两个事件,其中之一是用户定义的“<\<Bingo>>”。 在所选小部件的事件信息之后是一堆有关与所选小部件相关的绑定层次结构的信息。 我还没有发现这些东西有什么用。 绑定窗口可以完成两件事: 1. 为选定的小部件定义新的绑定第一个的主要动作是插入一个新事件。 通过单击“插入菜单”并选择其中的一项操作即可完成此操作。 2. 以明显的方式修改现有绑定的lambda表达式。 选择插入量 ![](https://img.kancloud.cn/74/94/74941d7a5e97bbddd67885a535ed554c_890x586.png) 如果找不到操作,则可以选择“高级...”。 ![](https://img.kancloud.cn/d4/ce/d4cef18220067b827506c521f731fc19_512x535.png) 在这里,您将看到各种各样的可能性。 首先,如果您希望事件是按键c,请选择顶部的输入框并输入“ c”;事件“ Key-c”出现在底部附近的“事件”输入框中。如果要修改事件以同时需要控制键,请从右列中选择“控制”,事件将变为“Control-Key-c ”。 对于按键事件以外的事件,请从左栏中选择一个事件。每个事件Tk都知道或多或少的事件列表。我不知道只列出特定窗口小部件将响应的事件,因此我无法删节该列表。 同样,可以通过从右列中选择一个修饰符来修改所选事件。请注意,左列包含Tk知道的所有虚拟事件。不幸的是,Tk跳过了几个,我尝试添加它们,但是我可能错过了一些。如果要为用户定义的虚拟事件生成代码(例如\<\<Bingo>>或Tk遗漏的代码),则可以将该虚拟事件手动添加到“事件”输入框中。是的,您可以编辑事件输入框。 现在已经组成了事件,您可以选择“添加”按钮,这将关闭插入窗口并将事件添加到“绑定窗口”的左栏中。 倒数第二步是适当地更改右栏中的骨架代码。基本上,只需添加参数并提供回调函数名称即可代替“ xxx”。最后,通过选择复选按钮保存结果。这与已经讨论过的命令的情况类似。 在本文档的其他地方,我使用了“回调”一词来表示出现在Python支持模块中的回调函数。在绑定级别,“真实”回调函数是lambda函数,它在支持模块中调用了回调函数。 这里的大事是,“真实”回调总是传递一个参数,即事件对象,因此需要一个lambda来接收该对象并调用Python回调,将任何参数传递给回调函数。这些参数可以包括也可以不包括事件对象。 “绑定”窗口中的虚拟lambda仅采用一个参数,即事件对象。这意味着用于传递事件对象(没有用户参数)的lambda为: ~~~ lambda e: foo_bar(e) ~~~ 或如果传递用户参数: ~~~ lambda e: foo_bar(e,5) ~~~ 当然,如果回调函数不需要参数,甚至不需要事件对象,则可以使用以下形式: ~~~ lambda e: foo_bar() ~~~ or ~~~ foo_bar ~~~ 上面的参数e是事件对象,其中包含有关事件的很多信息。 事件对象具有以下属性(来自Tkinter.py中的文档): ~~~ serial - 事件的序号 num - 按下鼠标按钮(ButtonPress,ButtonRelease) focus - 窗口是否具有焦点(Enter,Leave) height - 暴露窗口的高度(配置,公开) width - 暴露窗口的宽度(配置,公开) keycode - 所按下键的键控代码(KeyPress,KeyRelease) state - 事件的状态为数字(ButtonPress,ButtonRelease, Enter, KeyPress, KeyRelease, Leave, Motion) state - 状态为字符串(可见性) time - 事件何时发生 x - 鼠标的x位置 y - 鼠标的y位置 x_root - 鼠标在屏幕上的x位置 (ButtonPress, ButtonRelease, KeyPress, KeyRelease, Motion) y_root - 鼠标在屏幕上的y位置 (ButtonPress, ButtonRelease, KeyPress, KeyRelease, Motion) char - 按下的字符(KeyPress,KeyRelease) send_event - 请参阅X / Windows文档 keysym - 事件的keyym作为字符串(KeyPress,KeyRelease) keysym_num - 事件的按键符号,以数字形式表示(KeyPress,KeyRelease) type - 事件的类型,以数字表示 widget - 发生事件的窗口小部件 delta - 轮运动的增量(滚轮) ~~~ 有两点需要提及。 首先,“绑定窗口”在所选小部件的事件条目下方包含许多残篇,我无法理解且无法使用。 它似乎是上面提到的小部件的绑定层次结构的默认事件列表。 我只是在删除它而在玩弄。 此外,除了用于保存绑定的复选按钮或用于删除事件绑定的“ x”按钮之外,我从未使用菜单栏下方的按钮做任何事情。 绑定窗口的左侧列表框有一个弹出菜单,通过该菜单可以修改鼠标指针下的事件。 例如,它允许人们轻松地将事件\<Button-3>更改为\<Double-Button-3> 。 在4.8版中,引入了自定义小部件。 由于PAGE不了解这些小部件(包括绑定可能性),因此,刚描述的机制无法用于指定此类小部件的绑定。 您将必须在支持模块中执行此操作。