我有一系列按钮的通用回调。调用回调后,我想通过先前分配的名称来识别调用者。但是我无法在 Tkinter 文档中弄清楚如何做到这一点。有任何想法吗?
我的程序大约是。
def callback(event):
event.widget['text'] # 'name' does not work so
# I have to use the label of the button now, but it is a dirty solution.
root.bind("<Button-1>", cb_button)
Run Code Online (Sandbox Code Playgroud)
我需要名称,因为我使用pytkgen从 JSON 加载 GUI 。
更新:
贾斯汀的解决方案看起来不错,但为什么9不管点击哪个按钮,下面的代码总是打印出来?
def cb_button(i):
print i
buttons = [('btn'+str(i), i) for i in range(10)]
for (b, i) in buttons:
root.button(b, lambda: cb_button(i))
Run Code Online (Sandbox Code Playgroud)
小部件的 winfo_name() 方法返回小部件的名称。它通常是一个以字符串表示的 8 位数字,即:'40123211' 如果您有事件对象 evt,则使用:evt.widget.winfo_name()
在问题正文中,您问的是不同的问题:“我如何知道哪个按钮调用了通用回调函数”
使用 lambda 函数将唯一值传递给公共回调:
根据您问题的更新,我想我理解了这个问题。您有一个 JSON 文件,用于通过 pytkgen 创建 Tkinter 接口。在此 JSON 文件中定义了多个按钮,每个按钮都被赋予了唯一的名称。当向这些按钮分配命令时,它们都会获得相同的回调,但回调需要知道哪个按钮发起了调用,并且您希望通过名称来做到这一点。那是对的吗?
如果是这样,我猜测您当前正在创建这样的回调分配(非常通用的示例,假设这是通过调用JSON 文件的路径root返回的接口根):tkgen.gengui.TkJson
root.button("name1", callback)
root.button("name2", callback)
...
Run Code Online (Sandbox Code Playgroud)
但这并没有给你你想要的名字。传递名称的一种方法是创建一个lambda将按钮名称传递给回调函数的方法。回调分配将如下所示:
root.button("name1", lambda:callback("name1"))
root.button("name2", lambda:callback("name2"))
...
Run Code Online (Sandbox Code Playgroud)
那么你的回调定义可能如下所示:
def callback(name):
if name == "name1":
# Do something in here
elif name == "name2":
# Do something else in here
...
Run Code Online (Sandbox Code Playgroud)
更新:如果您在循环内创建按钮,则需要修改 lambda 定义以将所需的循环变量存储为关键字默认值。否则,循环变量的最终值将应用于所有按钮。
def cb_button(i):
print i
buttons = [('btn'+str(i), i) for i in range(10)]
for (b, i) in buttons:
root.button(b, lambda x=i: cb_button(x))
Run Code Online (Sandbox Code Playgroud)
向小部件对象添加属性
另一个解决方案是您可以在回调函数中检查按钮小部件对象的属性。(本例使用 Tkinter)
but1 = Tkinter.Button(root, text="Sync", width=10)
but1.bind("<Button-1>", doButton)
but1.myId = "this"
but2 = Tkinter.Button(root, text="Sync", width=10)
but2.bind("<Button-1>", doButton)
but2.myId = "that"
but2.otherStuff = "anything"
def doButton(evt):
if evt.widget.myId == "this":
print("This")
else:
print("That "+evt.widget.otherStuff)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7015 次 |
| 最近记录: |