Tkinter全局绑定

10 投票
4 回答
12589 浏览
提问于 2025-04-16 03:38

有没有办法把所有的小部件绑定到一个命令上,只用一行代码?这样我就可以一次性输入,而不是一个一个地处理每个小部件。

4 个回答

-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()
-2

如果你有一个包含所有小部件的列表,你可以一个一个地遍历这些小部件,并为它们分配事件。

18

你可以在根窗口上使用 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 的文本控件中绑定自定义事件? 在那里我会多讲讲绑定标签的事。

撰写回答