Salut,
J'avais laissé de côté mon script de bataille navale, je l'ai repris, j'ai résolu mon problème lié au thread, mais je n'arrive manifestement pas à résoudre en premier lieu un comportement sur le destroy d'un toplevel, ou alors c'est tellement flagrant que ça ne me saute pas aux yeux, et en second lieu le passage au 1er plan des fenêtres toplevel, les unes par rapport aux autres.
J'explique succinctement, j'ai l'appli principale qui contient plusieurs méthodes pour ouvrir différentes fenêtres, entre-autres :
MenuScores est une classe qui hérite d'une classe Classeur (hérite de Toplevel) et d'une classe MenuBase, c'est celle-ci qui me pose problème alors qu'elle est très simple.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 def scores(self, titre) : if not MenuScores.ouvert() : self.__scores = MenuScores(self.menuOptions, self.__theme, self.__langue, titre) self.__scores.afficher() else : self.__scores.avantPlan()
Dans cette classe deux problèmes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 class MenuBase : instances = [] def __init__(self) : MenuBase.instances.append(self) self.winfo_toplevel().bind('<Destroy>', self.__supInstance) self.i = 0 def boutonFermer(self, texte) : boutonsQuitter = tk.Button(self, text=texte, command=self.__quitter) boutonsQuitter.grid(pady=10) def __supInstance(self, evt=None) : self.i += 1 print(self.i) for n in MenuBase.instances : if n.__class__.__name__ == self.__class__.__name__ : MenuBase.instances.remove(n) def avantPlan(self) : self.lift() # Ne fonctionne pas sur unix self.attributes('-topmost', True) # Fonctionne un moment, mais au bout de n essais, ne fonctionne plus ''' # Pareil, fonctionne un moment, puis ça déconne for n in [n for n in MenuBase.instances if n.__class__.__name__ != self.__class__.__name__] : n.after_idle(self.attributes, '-topmost', False) self.lift() self.after_idle(self.attributes, '-topmost', True) ''' def __quitter(self) : #self.winfo_toplevel().destroy() self.destroy() @classmethod def ouvert(self) : return self.__name__ in [n.__class__.__name__ for n in MenuBase.instances]
- le lift, lorsque j'ouvre une fenêtre tkinter me la met bien en focus devant les autres toplevel, maintenant je voudrais admettons avec 2 fenêtres modales ouvertes, lorsque je clic à nouveau sur le menu d'une fenêtre déjà en cours d'exécution, elle passe au 1er plan devant les autres, mais au bout de plusieurs essais, ça ne fonctionne plus, et c'est pire encore si plus de 2 fenêtres sont ouvertes.
Je voudrais donc savoir si lift fonctionnait chez vous sur les widgets tkinter ?
Je suis sur Debian Jessie, architecture 64 bits.
- Le destroy, là je pige rien, je ne comprenais pas pourquoi tkinter appelait x fois ma fonction __supInstance, et j'ai percuté que cela variait en fonction du nombre d'enfants du toplevel, comme si tkinter détruisait récursivement tous les enfants sans le faire internement mais en appelant chaque fois la fonction reliée au destroy.
Donc soit mon erreur est tellement flagrante que je ne la voit pas, soit je n'ai pas compris quelquechose.
Une idée ?
Partager