Stopper un thread aprés clic sur barre titre
Bonjour à tous,
Voici mon problème :
je voudrais savoir s'il était possible de capter un évènement de clic sur la barre de titre d'une application, en fait, je voudrais que l'utilisateur ne puisse pas déplacer la fenêtre pendant l'exécution d'un thread.
1_ les coordonnées de la souris ne sont plus captées en cliquant sur la barre de titre.
2_ j'ai pensé aussi à faire disparaître la barre de titre avec overrideredirect(1) mais cette solution ne me convient pas.
Si l'utilisateur essaie de déplacer la fenêtre, je voudrais que l'action en cours s'arrête net.
Si quelqu'un a le temps d'éclairer ma lanterne je le remercie d'avance.
E.
[Python 3.X] Stopper un thread aprés clic sur barre titre
Bonsoir wiztricks et merci d'avoir répondu,
Tout d'abord c'est la fenêtre principale de mon application que l'on ne devrait pas déplacer pendant le thread, je viens d'essayer :
Code:
fenp.wm_configure('-disabled', True)
et une exception a été levé :
Code:
AttributeError: 'tkapp' object has no attribute 'wm_configure'
D'autre part, dans mon application , j'ai mis en oeuvre des Toplevel modales et je suis bien conscient du fonctionnement de ce type de fenêtre, et d'ailleurs
je l'utilise assez fréquement pour justement isoler une action , un thread etc, ce qui empêche l'action sur les boutons de la fenêtre située au-dessous (et c'est tant mieux), mais cela n'empêche pas de déplacer cette fenêtre (en dessous) en maintenant le clic gauche enfoncé sur la barre de titre. La fenêtre d'en dessous est désactivée tant que l'on a pas validé ce qu'on doit valider ou annulé ce que l'on doit annuler dans la Toplevel en cours, je pensais que la fenêtre d'en dessous serait désactivée au point de ne pas pouvoir la draguer, mais non !
J'utilise généralement cette forme pour écrire une fenêtre Toplevel :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
class Aide(tkinter.Toplevel) :
"""
L' aide contextuelle
"""
def __init__(self, maitre, titre) :
tkinter.Toplevel.__init__(self, maitre)
self.protocol("WM_DELETE_WINDOW", self.destroy)
self.title(titre)
self.update_idletasks()
self.transient(self.master) # fenêtre modale ###########################
self.grab_set() # capte les événements à son profit ####################
self.wait_window() |
...et ça marche parfaitement.
Dans mon cas , (mon problème), je voudrais seulement que l'utilisateur ne puisse pas draguer la fenêtre principale pendant un thread, ce thread est une lecture de sons midi illustrés par des grilles d'accords de guitare, chaque diagrammes lus est joué et reporté sur un manche de guitare,
chaque diagramme est une instance d'une classe où chaque point (les notes) sont fabriqués en temps réels, tout ceci fonctionne à merveille, sauf que si on a le malheur de vouloir déplacer la fenêtre principale en maintenant le clic gauche enfoncé, l'application freeze, voire plante !
Si je pouvais binder la barre de titre de la fenêtre principale, ce serait parfait.
en aparté :
Mon application est un immense dictionnaire d'accords pour instruments à cordes, dans la fenêtre principale on peut paramétrer un manche de 1 à 6 cordes et de 1 à 24 cases
on a accés à presque une centaine de types d'accords, l'utilisateur peut créer ses propres grilles d'accords , les sauvegarder sur le disque , les lire, les écouter
Etant professeur de guitare et musicien, cet outil me sert énormément, n'ayant pas trouvé d'équivalent auparavant, j'ai décidé de le concevoir, n'étant pas programmeur, j'ai été obligé d'étudier comme un forcené, éplucher les forums, imprimer du papier pour étudier ailleurs que devant l'ordi etc,
Quand j'étudie un outil python, je crée des exercices pour me l'approprier , le transformer, le digérer , le comprendre, mais quelquefois , je sèche, voilà je ne voulais pas m'écarter du sujet, juste vous donner une idée de ce projet que je développe avec passion.
Je vais chercher du coté des wm_configure, car ça, je ne connaissais pas.
Et merci wiztricks de votre attention.
E.
[Python 3.X] Stopper un thread aprés clic sur barre titre
bonjour wiztricks,
Code:
fenp.wm_attributes('-disabled', True)
fonctionne, et ça convient parfaitement à ce que je voulais obtenir :
je ne serais pas obligé de faire interrompre le thread au cas où l'utilisateur voudrais déplacer la fenêtre puisqu'il ne pourra plus !
en lecture :
Code:
fenp.wm_attributes('-disabled', True)
aprés le stop de la lecture:
Code:
fenp.wm_attributes('-disabled', False)
De plus rien n'a changé au niveau de la vitesse du thread, tout est fluide.
Je vais parfaire mes connaissances du Windows Manager, il est vrai que j'ai quelques lacunes à son sujet.
Merci encore pour les conseils et votre attention.
E.