如果我使用 bind_all,我可以对某些小部件进行例外处理吗?

if I use bind_all, can I make exceptions for some widgets?

我想利用 event.widget.winfo_parent(),但它 returns 一个带有 widget 完整路径的 str,我无法获取包装器将它放在 if 中以防止语句块执行。因此,我的问题是是否有更正确的方法来执行此操作或以某种方式获取容器,在本例中来自 self.btn 并在语句中使用它。谢谢

挑战在于按钮之间的例外,在示例中我只放了两个,但是如果我希望例外是针对几个按钮而不是全部,我该怎么办?

from tkinter import *

class Example(Frame)
    def __init__(self, master, *args, **kwargs):
        super().__init__(master, *args, **kwargs)
        self.frame = Frame(self, bg='yellow')
        self.frame .pack(side=TOP, fill=BOTH)
         
        self.cnt = Frame(self.frame, bg='green2')
        self.cnt .pack(side=TOP, fill=BOTH)

        self.btn = Button(self.cnt, text='Button 1 ')
        self.btn.pack()
        self.btn2 = Button(self.cnt, text='Button 2')
        self.btn2.pack()
        

        self.bind_all('<Motion-1>', self.hellow)

    def hellow(self, event):
        print('I always run how I want')

root = Tk()
app = Example(root)
app .pack(side=TOP, fill=BOTH)
root.mainloop()

您可以使用 isinstance 检查天气小部件是 Button 或其他什么。

def hellow(self, event):
    if not isinstance(event.widget,Button):
        print('I always run how I want, except when hovered over buttons')

每当您将鼠标悬停在 Button 以外的任何小部件上时,这将 运行 print。但请记住,这将为每个小部件 运行 hellow,但它不会为避免的小部件执行放在 if 块中的代码。

问题更新后: 您可以创建一个带有要避免的按钮的列表,然后只检查该小部件是否属于该列表。

class Example(Frame):
    def __init__(self, master, *args, **kwargs):
        super().__init__(master, *args, **kwargs)
        self.frame = Frame(self, bg='yellow')
        self.frame .pack(side=TOP, fill=BOTH)
        self.cnt = Frame(self.frame, bg='green2')
        self.cnt .pack(side=TOP, fill=BOTH)

        self.btn = Button(self.cnt, text='First')
        self.btn.pack()

        self.btn1 = Button(self.cnt, text='Second')
        self.btn1.pack()

        self.btn2 = Button(self.cnt, text='Third')
        self.btn2.pack()

        self.bind_all('<Motion>', self.hellow)

        self.to_avoid = [self.btn1,self.btn2] # Buttons to avoid list

    def hellow(self, event):
        if event.widget not in self.to_avoid:
            print('I always run how I want, except for some widgets')