Tkinter 全局绑定

问题描述 投票:0回答:5

是否可以用一行将所有小部件绑定到一个命令?如果我可以输入一行而不是单独执行每个小部件,那就太好了。

python binding widget tkinter global
5个回答
19
投票

您可以在根窗口上使用 bind_all 方法。这将适用于所有小部件(除非您从某些小部件中删除绑定标签“all”)。请注意,这些绑定最后触发,因此如果您愿意,您仍然可以覆盖特定小部件上的应用程序范围的绑定。

这是一个人为的例子:

import Tkinter as tk

class App:
    def __init__(self):
        root = tk.Tk()
        root.bind_all("<1>", self.woot)
        label1 = tk.Label(text="Label 1", name="label1")
        label2 = tk.Label(text="Label 2", name="label2")
        entry1 = tk.Entry(name="entry1")
        entry2 = tk.Entry(name="entry2")
        label1.pack()
        label2.pack()
        entry1.pack()
        entry2.pack()
        root.mainloop()

    def woot(self, event):
        print "woot!", event.widget

app=App()

您可能还对我对问题的回答感兴趣如何在 Tkinter Text 小部件中绑定自身事件,然后由 Text 小部件绑定?我在其中详细介绍了绑定标签。


0
投票
不幸的是,

bind_all
绑定了整个 Tkinter 程序中的每个小部件,甚至在其他窗口中也是如此。由于单独绑定每个小部件的主要问题是它在代码中重复并且不适用于模块化小部件层次结构,因此我创建了一个返回给定小部件的所有子小部件的函数:

def ALL_CHILDREN_OF(widget):
    done = []
    for child in widget.winfo_children():
        if len(child.winfo_children()) == 0:
            done.append(child)
        else:
            done.append(widget)
            done.extend(ALL_CHILDREN_OF(child))
    return done

然后我可以获取返回的可迭代对象并绑定每个项目:

for widget in ALL_CHILDREN_OF(shuffleRepsWindow):
        widget.bind_all('<Button-1>', lambda event: print(widget))

-2
投票

如果您有一个包含所有小部件的列表,您可以迭代它们并分配事件。


-2
投票

您的意思是像这样的代码,它处理用单个函数处理的所有鼠标事件?

from Tkinter import *

class ButtonHandler:

    def __init__(self):      
        self.root = Tk()
        self.root.geometry('600x500+200+200')

        self.mousedown = False
        self.label = Label(self.root, text=str(self.mousedown))
        self.can = Canvas(self.root, width='500', height='400', bg='white')

        self.can.bind("<Motion>",lambda x:self.handler(x,'motion'))
        self.can.bind("<Button-1>",lambda x:self.handler(x,'press'))
        self.can.bind("<ButtonRelease-1>",lambda x:self.handler(x,'release'))
        self.label.pack()
        self.can.pack()
        self.root.mainloop()

    def handler(self,event,button_event):
        print('Handler %s' % button_event) 
        if button_event == 'press':
            self.mousedown = True
        elif button_event == 'release':
            self.mousedown = False
        elif button_event == 'motion':
            if self.mousedown:               
                r = 5
                self.can.create_oval(event.x-r, event.y-r, event.x+r, event.y+r, fill="orange")
        self.label.config(text=str(self.mousedown))

button_event = ButtonHandler()

-3
投票

您也可以定义一个调用所有小部件的函数,然后调用该函数。或者更好的是创建一个类,在 init 中调用您的小部件并导入该类...

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