【问题标题】:if I use bind_all, can I make exceptions for some widgets?如果我使用 bind_all,我可以为某些小部件设置例外吗?
【发布时间】:2021-11-26 07:26:11
【问题描述】:

我想到了使用event.widget.winfo_parent(),但它返回一个strwidget 的完整路径,我无法抓取包装器将其放入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()

【问题讨论】:

    标签: python tkinter binding


    【解决方案1】:

    您可以使用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')
    

    【讨论】:

    • 感谢您的回答 但是,挑战是在buttons 之间产生异常,在示例中我只输入了一个是我的错误,但是如果我希望 exception 只针对少数 buttons 而不是全部,我该怎么办?
    • @JackieCk 早该提过,反正更新了答案
    • 你是对的,你的回答对于我提出的问题来说已经足够了,我会在我正在使用的实际范围内再次提出这个问题。非常感谢您的及时回复。
    • 请原谅我的坚持,但如果我以bind_all 为例,我说的是一个非常大的环境,其中buttonswidgets 有不同的父母。因此bind_all的逻辑使用。
    • 我已经再次问了这个问题......我添加了有问题的代码部分,我有问题找到小部件的父级
    猜你喜欢
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 2015-10-03
    相关资源
    最近更新 更多