IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tkinter Python Discussion :

Tkinter centre une fenetre


Sujet :

Tkinter Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2014
    Messages : 15
    Points : 15
    Points
    15
    Par défaut Tkinter centre une fenetre
    Bonsoir a tous ,

    j'aimerais savoir comment centre ma fenetre au milieux de l'écran j'ai essayé avec plusieurs code mais elle est pas au milieu bout de mon code :

    merci a tous

    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 ChoixEcole:
     
        def __init__(self):
     
            """Initialise l'application et change le titre"""
     
            self.root = Tk()
            self.root.title("ChoixEcole")
            self.root.resizable(False, False)
     
     
            """Initialise  entry et vcmd est une fonction qui verifie si l'utilisateur entre les bonnes informations"""
     
            vcmd = (self.root.register(self.callback),  '%P')
            self.entry_ecole=tkscrolled.ScrolledText(self.root, width=30, height=10,)
     
            """ Initialise les variables et les entrys et label pour afficher les moyennes et met 20 par défaut"""
     
            self.matieres = ('de maths', 'de physique', 'de si', "d'informatique", 'de francais',"d'anglais")
            self.var_matieres = [StringVar(self.root) for mat in range(len(self.matieres))]
            self.labels_matiere = [ Label(self.root, text='Moyenne '+mat) for mat in self.matieres ] 
            for var in self.var_matieres: var.set(20) 
            self.entries_matiere = [ Entry(self.root, textvariable=var, validate='key', validatecommand = vcmd) for var in self.var_matieres ]
     
            """Initialise les variables et les entrys et label pour afficher Specialite,Commune,Concours,Alternane 
               Et les elements 
                                                                             """
            self.affichage=('Specialité :','Region :','Concours:','Alternance')
            self.var_affichage=[StringVar(self.root) for aff in range(len(self.affichage))]
            self.labels_affichage= [ Label(self.root, text=aff) for aff in self.affichage ] 
            for i in range(0,4): self.var_affichage[i].set("Peu importe")
     
            """Les années de prepa"""
            self.annee=StringVar(self.root)
            self.anneeprepa=("3/2","5/2","7/2")
            self.annee.set("3/2")

  2. #2
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Salut.

    Dimensions et position de la fenêtre s'effectue avec geometry et la dimension de l'écran de l'utiliseur s'obtient avec winfo_screenheight et winfo_screenwidth.

    Tu as désormais tout ce qu'il faut pour placer ta fenêtre au centre de l'écran utilisateur
    Le temps ronge l'amour comme l'acide.

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Plutôt que de calculer, Tk a une primitive prête à l'emploi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import tkinter as tk
     
    def center_window(w):
        eval_ = w.nametowidget('.').eval
        eval_('tk::PlaceWindow %s center' % w)
     
    root = tk.Tk()
    w = tk.Toplevel()
    center_window(w)
    tk.mainloop()
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Hum, tu me perturbes wiztricks.

    Y a-t-il un intérêt a utiliser ton code plutôt qu'en passant par w.tk.call ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    window.tk.call('tk::PlaceWindow', window)
    J'imagine que le paramètre par défaut de PlaceWindow est center, mais je n'arrive pas à trouver sur le site de tcl/tk (8.6) la documentation concernant PlaceWindow, pour voir si on peut fournir d'autres paramètres, notamment le widget sur lequel centrer la toplevel.
    Je me demande si ce PlaceWindow n'est pas basé sur le gestionnaire de placement Place.
    Le temps ronge l'amour comme l'acide.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    tk::PlaceWindow n'est pas documenté mais çà ne gène pas grand monde.
    La différence entre tk.call et .eval est dans le passage des paramètres: .eval prend une chaine de caractères alors que tk.call prend un tuple. Dit comme çà, eval('tk::PlaceWindow %s center' % w), devrait être pareil que tk.call('tk::PlaceWindow', w, 'center').

    Les gestionnaires de placement positionnent des widget à l'intérieur d'autres wigdets ou de fenêtres "principales". C'est Tk qui fait le boulot.
    Les fenêtres principales (Tk, Toplevel) ne sont pas des widgets et leur position/dimension sont sous le contrôle du window manager qui tourne en dessous. Dans ce cas, Tk délègue.

    - W
    PS: désolé pour les coquilles dans le code que j'ai posté initialement. Elles sont corrigées.
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Merci des précisions

    J'ai même cherché dans les sources de tk vu qu’elles sont installées sur mon système, mais impossible de trouver ce PlaceWindow soit le nom est bâti sur une concaténation de deux mots, soit je ne cherche pas au bon endroit, bref j'abandonne.
    Le temps ronge l'amour comme l'acide.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    j'ai repris votre exemple pour le centrage des fenêtres root et w. J'ai mis une geometry sur la fenêtre w.
    le résultat fournit bien la fenêtre root au centre de l'écran et la fenêtre w est positionnée sur (j'en déduis) sur l'origine de la fenêtre root

    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
     
    import tkinter as tk
     
    def center_window(root):
    	eval_ = root.nametowidget('.').eval
    	eval_('tk::PlaceWindow %s center' % root)
     
    def center_window(w):
    	eval_ = w.nametowidget('.').eval
    	eval_('tk::PlaceWindow %s center' % w)
     
     
    root = tk.Tk()
    root.title("root")
    center_window(root)
     
     
    w = tk.Toplevel()
    w.geometry("1816x720+0+0")
    w.title("Toplevel")
    center_window(w)
     
    tk.mainloop()
    comment mettre ces deux fenêtres au centre de l'écran? merci

  8. #8
    Invité
    Invité(e)
    Par défaut
    j'ai trouvé :

    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
     
     
    def SAF_Contenu(root):
     
    	tp = tk.Toplevel()
    	tp.title("--- Titre ---")
    	tp.resizable(width=False, height=False)                 											# Fenêtre verrouillée
    	tp.attributes("-toolwindow", 1)                         												# Supprime les boutons Réduire/Agrandir
     
    	# Centrage du la fenêtre
    	# tp.geometry("1816x720+0+0")
    	window_height = 720
    	window_width = 1816
     
    	screen_width_px = tp.winfo_screenwidth()
    	screen_height_px = tp.winfo_screenheight()
     
    	x_cordinate = int((screen_width_px / 2) - (window_width / 2))
    	y_cordinate = int((screen_height_px / 2) - (window_height / 2))
     
    	tp.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate))

Discussions similaires

  1. Réponses: 19
    Dernier message: 27/01/2010, 11h50
  2. Réponses: 16
    Dernier message: 06/10/2006, 10h17
  3. Réponses: 2
    Dernier message: 17/05/2006, 14h26
  4. [Tkinter] image dans une fenetre
    Par THE_VIP dans le forum Tkinter
    Réponses: 3
    Dernier message: 13/05/2006, 08h38
  5. [Tkinter] Démarrer une fenetre en plein écran
    Par Kyti dans le forum Tkinter
    Réponses: 1
    Dernier message: 20/04/2005, 18h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo