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
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.
Si vous avez une liste qui contient tous vos widgets, vous pouvez parcourir ces derniers et affecter les événements.
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 ...
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()
- 1. Binding StringFormat
- 2. DataGridView Binding
- 3. Python Tkinter Return
- 4. Différence entre {Binding PropertyName} et {Binding Path = PropertyName}
- 5. Log Parser Early Binding
- 6. Adresses IP JBoss Binding
- 7. WPF Binding Help
- 8. WPF Canvas Binding
- 9. jQuery Binding Malheurs
- 10. MVC2 ViewModel Binding
- 11. WPF Commande Binding
- 12. Swing data binding frameworks
- 13. WPF ListBox Binding ItemsSource
- 14. Silverlight ItemTemplate binding
- 15. Java Event Binding
- 16. ItemsControl MVVM Binding
- 17. WPF Binding & Converters
- 18. Silverlight Element Binding
- 19. Silverlight Data Binding
- 20. Binding ArrayCollections of Arrays
- 21. Java XML Binding
- 22. WPF checkbox binding
- 23. WebSocket WCF Transport Binding
- 24. Que signifie 'ItemsSource = "{Binding}"'?
- 25. WPF - Réévaluer OneWay Binding
- 26. Modèle MVC2 Binding Enumerables?
- 27. WPF Dynamic Binding
- 28. MVC Complex Model Binding
- 29. WPF ListBox + Binding + IDataErrorInfo =?
- 30. WPF TreeView Binding
Quand je change '' <1> de '', cela fonctionne si Tinter est en cours d'exécution en arrière-plan? –
Tetsudou
@Tetsudou: cela ne fonctionnera que lorsque l'application aura le focus sur le clavier. –