Salut tt l'mnd,
Après m'être galeré quelques heures pour centrer automatiquement une application au démarage sans définir manuellement sa taille, j'ai finalement trouvé, et je me suis dis que ça pourrais faire gagner du temps à certain de connaître cette astuce...
Le plus gros pros problème résidait dans le fait que si on executait l'instruction root.winfo_width() (ou height()) avant l'instruction root.mainloop() on obtenait 1, logique quand on y pense puique la fenêtre n'était pas encore "crée", l'astuce consiste donc à executer (entre autres) cette instruction "après" root.mainloop().
Voici donc l'astuce que j'ai trouvée :
Et voilà
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
37
38
39
40 from TKinter import * #je crée l'application dans une classe, je préfere simplement faire comme ça, rien d'obligatoire class Application: def __init__(self): self.root=Tk() Button(self.root,text='Un bouton') #pour que la taille de l'application soit variable dans l'exemple, je vais simplement essayer d'ouvrir un fichier en mode lecture, puis le fermer, si le fichier est présent, alors un autre bouton sera créée try: fileop=open('./blabla','r') fileop.close() Button(self.root, text='Un autre bouton' except: None #on appelle la methode qui va nous servir à definir le placement de notre application self.defgeometry() def defgeometry(self): #Si la largeur de l'application = 1 (ce ce qui est le cas lors du premier appel de la méthode, puisque mainloop n'est pas encore lancé) if self.root.winfo_width() == 1: #alors répète cette méthode après un centième de seconde (entre-temps mainloop devrait être entré en fonction) self.root.after(10, self.defgeometry) else: #on récupère la résolution de l'écran resolution=(self.root.winfo_screenwidth(),self.root.winfo_screenheight()) #on récupère la taille de l'application size=(self.root.winfo_width(),self.root.winfo_height()) #on définit ensuite le decalage de l'application en pixel par rapport au point d'origine de l'écran (0,0) decal=[] for i in range(len(size)): tmp=(decal[i]/2)-(size[i]/2) #ou (decal[i]-size[i])/2 decal.append(tmp) #enfin, on redéfinit la geometry de la fenêtre #soluce a : on redéfinit entierement self.root.geometry(str(size[0])+'x'+str(size[1])+'+'+str(decal[0])+'+'+str(decal[1])) #soluce b : on définit juste le décalage self.root.geometry('+'+str(decal[0])+'+'+str(decal[1])) #-----Lancement de l'application a=Application() a.root.mainloop()
EDIT : Je crois finalement avoir trouvé la façon 'officielle' d'y parvenir, et avec de meilleurs résultats sous windows (ou autre), enfin tout du moins une façon moins sytème D : plus besoin de la fonction after, avant de faire apel à la fonction qui centrera la fenêtre, mais après que tous les éléments graphiques contenu dans cette dernière soient définit, on force la fenêtre à centrer (root ou Toplevel) à s'actualiser graphiquement, ce qui "dessine" la dite fenêtre...
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
37 from TKinter import * #je crée l'application dans une classe, je préfere simplement faire comme ça, rien d'obligatoire class Application: def __init__(self): self.root=Tk() Button(self.root,text='Un bouton') #pour que la taille de l'application soit variable dans l'exemple, je vais simplement essayer d'ouvrir un fichier en mode lecture, puis le fermer, si le fichier est présent, alors un autre bouton sera créée try: fileop=open('./blabla','r') fileop.close() Button(self.root, text='Un autre bouton' except: None #on force l'actualisation de root self.root.update_idletasks() #on appelle la methode qui va nous servir à definir le placement de notre application self.defgeometry() def defgeometry(self): #on récupère la résolution de l'écran resolution=(self.root.winfo_screenwidth(),self.root.winfo_screenheight()) #on récupère la taille de l'application size=(self.root.winfo_width(),self.root.winfo_height()) #on définit ensuite le decalage de l'application en pixel par rapport au point d'origine de l'écran (0,0) decal=[] for i in range(len(size)): tmp=(decal[i]/2)-(size[i]/2) #ou (decal[i]-size[i])/2 decal.append(tmp) #enfin, on redéfinit la geometry de la fenêtre #soluce a : on redéfinit entierement self.root.geometry(str(size[0])+'x'+str(size[1])+'+'+str(decal[0])+'+'+str(decal[1])) #soluce b : on définit juste le décalage self.root.geometry('+'+str(decal[0])+'+'+str(decal[1])) #-----Lancement de l'application a=Application() a.root.mainloop()
Partager