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 :

centrer une fenêtre.


Sujet :

Tkinter Python

  1. #1
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Points : 65
    Points
    65
    Par défaut centrer une fenêtre.
    Bonjour,

    Je voudrais utiliser une variable "varQuelleFen" pour le nom de cette fenêtre secondaire, je ne comprends pas quelle ne fonctionne pas avec geometry :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        varQuelleFen="fenNew"
        varCoulPrinc = "Dark Olive Green"
        varCoulSecon = "Olive Drab"
        fenNew = Toplevel()
        fenNew.title("Nouveau code")
        fenNew.configure(bg=varCoulPrinc)
     
        # fenNew.geometry("480x250+840+525")    # Cette commande fonctionne
        print(varQuelleFen) # Inscrit bien : fenNew
        varQuelleFen.geometry("480x250+840+525")  #Pas celle-ci pourquoi ?
    Le msg d'erreur est : "AttributeError: 'str' object has no attribute 'geometry'"
    Je crois comprendre que le pb viens du fait que fenNew est un objet et non pas un texte, comment je fais ?

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 292
    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 292
    Points : 36 788
    Points
    36 788
    Par défaut
    Salut,

    Citation Envoyé par Ragus1970 Voir le message
    Je voudrais utiliser une variable "varQuelleFen" pour le nom de cette fenêtre secondaire, je ne comprends pas quelle ne fonctionne pas avec geometry :
    fenNew = Toplevel() assigne la fenêtre à la variable fenNew et une variable, c'est un peu plus que la seule chaîne de caractères "fenNew"...

    - W

  3. #3
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Points : 65
    Points
    65
    Par défaut
    D'accord, ça veut dire que je ne peut pas utiliser une variable pour cette ligne de code en désignant une fenêtre ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    varQuelleFen.geometry("480x250+840+525")

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 292
    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 292
    Points : 36 788
    Points
    36 788
    Par défaut
    Citation Envoyé par Ragus1970 Voir le message
    je ne peut pas utiliser une variable pour cette ligne de code en désignant une fenêtre ?
    Vous pouvez utiliser toute variable associée à un objet ayant une méthode .geometry. varQuelleFen associée à la chaîne de caractères "fenNew" plantera.
    Mais fenNew.geometry("480x250+840+525") fonctionnera (parce qu'un Toplevel sait ce qu'est .geometry). De même que varQuelleFen.geometry("480x250+840+525") si vous lui aviez assigné fenNew avant.
    Et si vous êtes aussi dérouté peut être qu'il faudrait revoir ce qu'est variable, chaîne de caractères,... car sinon vous allez avoir de grosses surprises.

    - W

  5. #5
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Points : 65
    Points
    65
    Par défaut
    Bonjour,

    je comprends pas trop, je lui ai bien assigné "fenNew" par ceci :


  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 292
    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 292
    Points : 36 788
    Points
    36 788
    Par défaut
    Citation Envoyé par Ragus1970 Voir le message
    je comprends pas trop, je lui ai bien assigné "fenNew" par ceci :

    Je sais que répéter est à la base de la pédagogie mais si vous n'avez pas compris ce que j'ai écrit, pas la peine que je "répète" puisque vous pouvez le relire par vous même... et prendre le temps de comprendre (là c'est plus dur car c'est vos neurones qui doivent se connecter).

    - W

  7. #7
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Points : 65
    Points
    65
    Par défaut
    Oui je sais, c'est du texte, mais je ne peut pas faire non plus varQuelleFen=fenNew
    Plutôt que de me prendre pour un débile, donne moi la solution !

    Tu as fait comment au début, tu avais la science infuse ?

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 292
    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 292
    Points : 36 788
    Points
    36 788
    Par défaut
    Citation Envoyé par Ragus1970 Voir le message
    Oui je sais, c'est du texte, mais je ne peut pas faire non plus varQuelleFen=fenNew
    Plutôt que de me prendre pour un débile, donne moi la solution !
    Si vous voulez que varQuelleFen.geometry("480x250+840+525") fonctionne, après avoir assigné varQuelleFen="fenNew", il n'y a pas de solution...
    Donc inutile d'espérer que je vous en donne une.

    - W

  9. #9
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Points : 65
    Points
    65
    Par défaut
    Oui, je vois bien qu'il ne faut pas utiliser varQuelleFen="fenNew" car c'est du texte, c'est compris.
    je vais me demerder.

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 292
    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 292
    Points : 36 788
    Points
    36 788
    Par défaut
    Et si vous commenciez par décrire le problème que vous cherchez à résoudre plutôt que vouloir faire fonctionner un truc qui ne peut pas marcher?

    - W

  11. #11
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Points : 65
    Points
    65
    Par défaut
    Je veux créer une fonction pour centrer mes différentes fenêtres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def centrefenetre(varQuelleFen, tailleH, tailleV, ECRANV, ECRANH):
        varQuelleFen.geometry("480x250+600+340")
     
    varQuelleFen="fen1"    #Marche pas car texte
    #   Résolution Ecran Windows
    import ctypes
    user32 = ctypes.windll.user32
    ECRANV = user32.GetSystemMetrics(0) // 2    #   Milieu d'écran windows vertical
    ECRANH = user32.GetSystemMetrics(1) // 2    #   Milieu d'écran windows horizontale
    #  Taille de cette fenêtre
    tailleH = 600
    tailleV = 525
    # Appel fonction
    centrefenetre(varQuelleFen, tailleH, tailleV, ECRANV, ECRANH)

    Je veux juste arriver a ce que la variable varQuelleFen soient reconnu en tant que nom de fenêtre


    PS : tailleH, tailleV, ECRANV, ECRANH ne sont là que pour plus tard pour modifier la fonction en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    varQuelleFen.geometry(str(tailleH) + "x" + str(tailleV) + "+" + str(ECRANV) + "+" + str(ECRANH))
    enfin un truc comme cela.

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 292
    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 292
    Points : 36 788
    Points
    36 788
    Par défaut
    Citation Envoyé par Ragus1970 Voir le message
    Je veux créer une fonction pour centrer mes différentes fenêtres :
    Çà je comprends, mais vous avez déjà la solution que vous montrez.

    Citation Envoyé par Ragus1970 Voir le message
    Je veux juste arriver a ce que la variable varQuelleFen soient reconnu en tant que nom de fenêtre
    Ok, mais çà va vous aider en quoi ?

    - W

  13. #13
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Points : 65
    Points
    65
    Par défaut
    Ok, mais çà va vous aider en quoi ?

    C'est pour pouvoir appeler ma fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    centrefenetre(varQuelleFen, tailleH, tailleV, ECRANV, ECRANH)
    car il y aura différentes fenêtre qui auront besoin d'être centrées donc a chaque fois j'utiliserais cette fonction.

  14. #14
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Points : 65
    Points
    65
    Par défaut
    En gros :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fenNew.geometry("480x250+840+525")
    Ca fonctionne mais quand je veut remplacer fenNew par une variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    varQuelleFen.geometry("480x250+840+525")
    ça plante et je sais pas comment trouver la bonne syntaxe.

  15. #15
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 292
    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 292
    Points : 36 788
    Points
    36 788
    Par défaut
    Citation Envoyé par Ragus1970 Voir le message
    car il y aura différentes fenêtre qui auront besoin d'être centrées donc a chaque fois j'utiliserais cette fonction.
    Certes mais pourquoi vous ne pas passer directement la fenêtre i.e. w = Toplevel(); centrer_fenetre(w,....)? A quoi vous sert de passer par une autre variable (qui en plus ne peut pas marcher)?

    - W

  16. #16
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Points : 65
    Points
    65
    Par défaut
    Et bien parce que bêtement j'était persuadé d'avoir essayer cela.
    du coup cela donne ceci :


    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
    def centrefenetre(varQuelleFen, tailleH, tailleV):
        varQuelleFen.geometry(str(tailleH) + "x" + str(tailleV) + "+" + str(ECRANL) + "+" + str(ECRANH))
     
    #   Résolution Ecran Windows
    import ctypes
    user32 = ctypes.windll.user32
    ECRANL = user32.GetSystemMetrics(0) // 2    #   Milieu d'écran windows horizontale
    ECRANH = user32.GetSystemMetrics(1) // 2    #   Milieu d'écran windows verticale
     
     
    fenNew = Toplevel()
    #   Création des boutons, zones de texte ect... que je n'ai pas mis ici car inutile et ça pollu.
     
     
    #   Extraction de la position X et Y de la fenêtre fenNew
    print(fenNew.geometry())             # pour tests
    a = fenNew.geometry().find("x")  # donne la position du 1er "x" dans la chaine ex: 480x400+600+325 donnera 3
    b = fenNew.geometry().find("+")  # donne la position du 1er "+" dans la chaine ex: 480x400+600+325 donnera 7
    varX = fenNew.geometry()[0:a]
    varY = fenNew.geometry()[a + 1:b]
    #  Appel fonction centrage de fenêtre
    centrefenetre(fenNew, varX, varY)
    fenNew.mainloop()
    Par contre je ne m'explique pas que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print(fenNew.geometry())
    donne 1x1+0+0 alors que ce code est après la création des boutons, labels...
    La fenêtre s'affiche pourtant bien et évidement elle ne fait pas 1*1 pixels

  17. #17
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Points : 65
    Points
    65
    Par défaut
    Rectification, la fenêtre s'affiche correctement mais pas au milieu si je met un return avant l'appel à la fonction (donc pas de centrage a ce moment) pour tester :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        varX = fenNew.geometry()[0:a]
        varY = fenNew.geometry()[a + 1:b]
        print(varX)   # donne 1
        print(varY)   # donne 1
     
        return
     
        centrefenetre(fenNew, varX, varY)
        fenNew.mainloop()
    Je vois pas ou je me plante pour que ça ne donne pas les vrai valeurs

  18. #18
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Points : 65
    Points
    65
    Par défaut
    En retirant seulement le return, la fenêtre est bien au milieu de l'écran mais fait 1*1 pixels

  19. #19
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 292
    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 292
    Points : 36 788
    Points
    36 788
    Par défaut
    Salut,

    Il ne faut pas oublier ce que "piloté par les évènements" veut dire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> from tkinter import Toplevel
    >>> w = Toplevel()
    La fenêtre s'affiche mais un certain nombre de mises à jour restent dans la pile des évènements "à traiter" et dans ce cas particulier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> w.geometry()
    '1x1+0+0'
    Donc on force le traitement des évènements en attente:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> w.update_idletasks()
    >>> w.geometry()
    '200x200+125+125'
    >>>
    Et c'est à jour.

    - W

  20. #20
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Points : 65
    Points
    65
    Par défaut
    Grand merci, ca marche,

    Je connaissais pas la commande idletasks.
    Je vais potasser ça.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Variable d'entrée non prise en compte
    Par Aldous dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 09/09/2011, 14h15
  2. variable non prise en compte
    Par oliv27400 dans le forum MATLAB
    Réponses: 2
    Dernier message: 08/11/2010, 09h28
  3. Permissions CACLS variable non prise en compte
    Par Selkurs dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 12/03/2009, 13h27
  4. Variables de my.cnf non prises en compte
    Par bluemartini dans le forum Administration
    Réponses: 7
    Dernier message: 26/02/2009, 18h14
  5. Variable non prise en compte dans un formulaire
    Par stomerfull dans le forum Langage
    Réponses: 2
    Dernier message: 04/08/2008, 14h36

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