繁体   English   中英

如何在Python中的Tkinter的小部件上使用Tcl / Tk绑定函数?

[英]how to use Tcl/Tk bind function on Tkinter's widgets in Python?

尽管Tkinter是从Tcl / Tk衍生而来的,但它不如Tcl / Tk完整。 Tcl / Tk绑定函数具有tkinter不具备的一些属性(例如,%d返回事件https://www.tcl.tk/man/tcl8.4/TkCmd/bind.htm#M24的详细信息字段)。
Tcl / Tk脚本可由python中的“ eval”功能使用,但我不知道如何在Tcl / Tk脚本中声明tkinter小部件。

所以我如何在Tkinter小部件上使用此功能及其属性?

如果您询问如何创建一个利用“数据”字段的绑定(即: %d替换),则必须调用一些tcl代码以实现此目的。 这需要两个步骤:创建一个调用python函数的tcl命令,并使用tcl将事件绑定到该函数。

首先,让我们创建一个python程序,该程序可以创建一个事件并设置“ data”字段(这假定存在一个名为root的全局变量,稍后我们将对其进行创建)。 调用此函数时,它将生成一个自定义事件,其中的数据字段由字符串填充。

def create_custom_event():
    root.event_generate("<<Custom>>", data="Hello, world")

接下来,让我们创建一个程序来在按下按钮时调用该函数

import tkinter as tk
root = tk.Tk()
button = tk.Button(root, text="click me", command=create_custom_event)
button.pack(side="top", padx=20, pady=20)
root.mainloop()

接下来,我们需要创建一个在事件生成时调用的函数。 我们计划设置data字段,因此此函数必须接受一个值,该值是%d替换的值。

def callback(detail):
    print("detail: %s" % detail)

因为您要使用%d替换,所以我们必须通过Tcl创建绑定。 但是,tcl不会自动了解我们的python函数,因此我们必须向tcl注册该函数。 然后,只需通过tcl接口调用bind来设置绑定即可。

然后,第一步是注册回调。 我们已经创建了函数,我们只需要创建一个调用该函数的tcl函数即可。 幸运的是,tkinter为我们提供了使用register命令执行此操作的方法。 您可以这样使用它:

cmd = root.register(callback)

这需要一个python函数(在这种情况下为callback函数),并创建一个tcl命令来调用该函数。 register返回该tcl命令的名称,该名称存储在名为cmd的变量中(名称无关)

接下来,我们需要通过Tcl建立绑定以调用此命令。 如果我们在实际的tcl脚本中执行此操作,则该命令将类似于以下内容(其中“。”代表根窗口):

bind . <<Custom>> {callback %d}

python等效项是这样的:

root.tk.call("bind", root, "<<Custom>>", cmd + " %d")

注意,要call的参数和tcl参数之间存在1:1的对应关系。 方便的是,tkinter小部件的默认字符串表示形式是内部tcl名称,因此我们可以在调用中直接使用该小部件(尽管,从理论上讲,也许我们应该使用str(root) )。

将所有内容放在一起即可得到结果,当您单击按钮时,它会打印出“详细信息:Hello,world”:

import tkinter as tk

def callback(detail):
    print("detail: %s" % detail)

def create_custom_event():
    root.event_generate("<<Custom>>", data="Hello, world")

root = tk.Tk()

button = tk.Button(root, text="click me", command=create_custom_event)
button.pack(side="top", padx=20, pady=20)

cmd = root.register(callback)
root.tk.call("bind", root, "<<Custom>>", cmd + " %d")

root.mainloop()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM