【问题标题】:Tkinter Global BindingTkinter 全局绑定
【发布时间】:2011-04-07 12:53:14
【问题描述】:

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

【问题讨论】:

    标签: python binding widget tkinter global


    【解决方案1】:

    您将在根窗口上使用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()
    

    您可能还对my answer 和问题How to bind self events in Tkinter Text widget after it will binded by Text widget? 感兴趣,在这里我会更多地讨论绑定标签。

    【讨论】:

    • 当我将 &lt;1&gt; 更改为 &lt;Key&gt; 时,如果 Tinter 在后台运行,这是否有效?
    • @Tetsudou:只有当应用程序有键盘焦点时才会起作用。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-25
          相关资源
          最近更新 更多