如何在事件中获取小部件名称

问题描述 投票:2回答:4
from tkinter import *

main = Tk()

def flipper(event):

    # I'd like to do this:
    #if widgetname == switcher:
        #do stuff
    #if widgetname == switcher1:
        #do stuff
    return

switcher = Label(main, bg='white', text="click here", font="-weight bold")
switcher.grid()
switcher.bind("<Button-1>", flipper)


switcher1 = Label(main, bg='white', text="click here", font="-weight bold")
switcher1.grid()
switcher1.bind("<Button-1>", flipper)

switcher2 = Label(main, bg='white', text="click here", font="-weight bold")
switcher2.grid()
switcher2.bind("<Button-1>", flipper)

switcher3 = Label(main, bg='white', text="click here", font="-weight bold")
switcher3.grid()
switcher3.bind("<Button-1>", flipper)

switcher4 = Label(main, bg='white', text="click here", font="-weight bold")
switcher4.grid()
switcher4.bind("<Button-1>", flipper)

switcher5 = Label(main, bg='white', text="click here", font="-weight bold")
switcher5.grid()
switcher5.bind("<Button-1>", flipper)


main.mainloop()

在我的事件函数中,我想根据点击的标签做不同的事情。我所知道的是,我只能获取被点击的小部件的标识号,而不是名称。如果我能获得所有小部件的标识符,那么我可以这样做:

def flipper(event):
    if event.widget == switcher.identifier():
           do stuff

但我无法找到如何获取指定小部件的ID ...

如何通过其标识符(event.widget())获取窗口小部件的名称?

或者如何获取指定小部件名称的标识符?

如果两者都不可能,那么我必须为每个标签创建一个不同的函数并绑定,这是很多希望不需要的工作。


编辑:

from tkinter import *

main = Tk()

def flipper(event, switch):
    if switch.widget == 's1':
        print("got it")

switcher = Label(main, bg='white', text="click here", font="-weight bold")
switcher.grid()
switcher.bind("<Button-1>", flipper)
switcher.widget = 's1'


main.mainloop()
python python-3.x tkinter widget
4个回答
8
投票

您无法获取窗口小部件所分配的变量名称,这将是相对无用的。可以将窗口小部件分配给多个变量,或者根本不分配。

获取标签文字

您可以访问实际的窗口小部件,您可以使用它来获取标签上的文本。您的示例显示所有标签都相同,因此这可能对您没有用:

def flipper(event):
    print("label text:", event.widget.cget("text"))

使用自定义小部件名称

您还可以为窗口小部件命名。你不能准确地回到名字,但你可以非常接近。例如,如果您创建这样的标签:

switcher = Label(main, name="switcher", bg='white', text="click here", font="-weight bold")

您可以通过拆分“。”来获取窗口小部件的字符串表示形式。并取最后一个值:

def flipper(event):
    print("widget name:", str(event.widget).split(".")[-1])

通过绑定传递名称

最后,您可以设置绑定,以便将名称发送到函数:

switcher.bind("<Button-1>", lambda event: flipper(event, "switcher"))
switcher1.bind("<Button-1>", lambda event: flipper(event, "switcher1"))

4
投票

您可以使用event.widget从单击的小部件中获取标准参数

例:

import tkinter as tk

def callback(event):
    print(event.widget['text'])

main = tk.Tk()

switcher = tk.Label(main, text="click here")
switcher.grid()
switcher.bind("<Button-1>", callback)

main.mainloop()

您可以将自己的变量分配给窗口小部件

switcher.extra = "Hello"

然后得到它

event.widget.extra

例:

import tkinter as tk

def callback(event):
    print(event.widget['text'])
    print(event.widget.extra)

main = tk.Tk()

switcher = tk.Label(main, text="click here")
switcher.grid()
switcher.bind("<Button-1>", callback)
switcher.extra = "Hello"

main.mainloop()

您可以使用lambda将函数与参数绑定

bind("<Button-1>", lambda event:callback(event, "Hello"))

例:

import tkinter as tk

def callback(event, extra):
    print(event.widget['text'])
    print(extra)

main = tk.Tk()

switcher = tk.Label(main, text="click here")
switcher.grid()
switcher.bind("<Button-1>", lambda event:callback(event, "Hello"))

main.mainloop()

0
投票

快速又脏 - 您可以使用该功能检查切换器属性。

def flipper(event, switch):
    if switch.widget == 's1':
        do_stuff
        return stuff
    if switch.widget == 's2':
        do_stuff
        return stuff

switcher1.widget = 's1'
switcher2.widget = 's2'

0
投票

我知道这是一个老帖子,但我遇到了同样的问题,我想我应该分享一个解决方案,以防有人感兴趣。您可以通过创建窗口小部件的子类来为窗口小部件命名。例如。 “按钮”是一个小部件。您可以创建一个继承自按钮的子窗口小部件“MyButton”,然后向其添加一个实例变量(例如name,uniqueID等)

这是一段代码片段

class MyButton(Button):
    def __init__(self, master = None, textVal = "", wName = ""):
        Button.__init__(self, master, text =  textVal)
        self.widgetID = wName #unique identifier for each button. 

当你想创建一个新的按钮小部件时,使用b = MyButton(.....),而不是b = Button(.......)

这样,您就拥有了按钮的所有功能以及唯一标识符。

© www.soinside.com 2019 - 2024. All rights reserved.