gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 21:43:39 35 4
gpt4 key购买 nike

虽然 Tkinter 是从 Tcl/Tk 派生出来的,但它不如 Tcl/Tk 完整。 Tcl/Tk 绑定(bind)函数有一些 tkinter 没有的属性(例如 %d 从事件中返回 The detail field https://www.tcl.tk/man/tcl8.4/TkCmd/bind.htm#M24)。
Tcl/Tk 脚本可由 python 中的“eval”函数使用,但我不知道如何在 Tcl/Tk 脚本中声明 tkinter 小部件。

那么我如何在 Tkinter 小部件上使用此函数及其属性?

最佳答案

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

首先,让我们创建一个 python 程序,它可以创建一个事件并设置“数据”字段(这假设存在一个名为 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 创建绑定(bind)。但是,tcl 不会自动知道我们的 python 函数,因此我们必须向 tcl 注册该函数。然后只需通过 tcl 接口(interface)调用 bind 来设置绑定(bind)即可。

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

cmd = root.register(callback)

这需要一个 python 函数(在本例中为 callback),并创建一个将调用该函数的 tcl 命令。 register 返回我们存储在名为 cmd 的变量中的那个 tcl 命令的名称(名称无关紧要)

接下来,我们需要通过 Tcl 设置一个绑定(bind)来调用这个命令。如果我们在实际的 tcl 脚本中执行此操作,命令将如下所示(其中“.”代表根窗口):

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

Python 等价物是这样的:

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

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

把它们放在一起给我们这个,当你点击按钮时打印出“detail: 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()

关于python - 如何在 Python 中的 Tkinter 小部件上使用 Tcl/Tk 绑定(bind)函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41912004/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com