2010-09-02 7 views
4

Est-il possible de lier tous les widgets à une commande, avec une seule ligne? Ce serait bien si je pouvais taper dans une ligne plutôt que de faire chaque widget individuellement.Tkinter Global Binding

Répondre

7

Vous utiliserez la méthode bind_all sur la fenêtre racine. Cela s'appliquera à tous les widgets (sauf si vous supprimez le bindtag "all" de certains widgets). Notez que ces liaisons se déclenchent en dernier, de sorte que vous pouvez toujours remplacer la liaison à l'échelle de l'application sur des widgets spécifiques si vous le souhaitez.

Voici un exemple artificiel:

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

Vous pourriez également être intéressé par my answer à la question How to bind self events in Tkinter Text widget after it will binded by Text widget? où je parle un peu plus sur bindtags.

+0

Quand je change '' <1> de '' , cela fonctionne si Tinter est en cours d'exécution en arrière-plan? – Tetsudou

+0

@Tetsudou: cela ne fonctionnera que lorsque l'application aura le focus sur le clavier. –

-1

Si vous avez une liste qui contient tous vos widgets, vous pouvez parcourir ces derniers et affecter les événements.

-1

Vous pouvez également définir une fonction qui appelle tous vos widgets et appeler cette fonction. Ou mieux encore créer une classe qui appelle vos widgets dans init et importer la classe ...

-1

Vous voulez dire quelque chose comme ce code qui gère tous les événements de souris gérés avec une seule fonction?

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