Ima*_*man 2 python bind tk-toolkit tkinter tcl
尽管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")
Run Code Online (Sandbox Code Playgroud)
接下来,让我们创建一个程序来在按下按钮时调用该函数
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()
Run Code Online (Sandbox Code Playgroud)
接下来,我们需要创建一个在事件生成时调用的函数。我们计划设置该data字段,因此此函数必须接受一个值,即%d替换值。
def callback(detail):
print("detail: %s" % detail)
Run Code Online (Sandbox Code Playgroud)
因为您要使用%d替换,所以我们必须通过Tcl创建绑定。但是,tcl不会自动了解我们的python函数,因此我们必须向tcl注册该函数。然后,只需bind通过tcl接口调用即可设置绑定。
然后,第一步是注册回调。我们已经创建了函数,我们只需要创建一个调用该函数的tcl函数即可。幸运的是,tkinter为我们提供了使用该register命令执行此操作的方法。您可以这样使用它:
cmd = root.register(callback)
Run Code Online (Sandbox Code Playgroud)
这需要一个python函数(callback在这种情况下),并创建一个tcl命令来调用该函数。register返回我们存储在名为的变量中的tcl命令cmd的名称(该名称无关紧要)
接下来,我们需要通过Tcl建立绑定以调用此命令。如果我们在实际的tcl脚本中执行此操作,则该命令将类似于以下内容(其中“。”代表根窗口):
bind . <<Custom>> {callback %d}
Run Code Online (Sandbox Code Playgroud)
python等效项是这样的:
root.tk.call("bind", root, "<<Custom>>", cmd + " %d")
Run Code Online (Sandbox Code Playgroud)
请注意,to的参数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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
803 次 |
| 最近记录: |