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 :

Problème de redimensionnement de fenêtre


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Pierrot92320
    Homme Profil pro
    Ingénieur en retraite (électronique)
    Inscrit en
    Avril 2009
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur en retraite (électronique)
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2009
    Messages : 159
    Par défaut Problème de redimensionnement de fenêtre
    Bonjour

    Je ne comprends pas ce qui se passe dans le programme suivant. Si vous le lancez vous comprendrez mon problème.

    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
    from tkinter import *
     
    class AppliBase(Frame):
        def __init__(self):
            Frame.__init__(self, bg='pink')
            self.pack()
     
            # Instanciation d'un canevas
            can = Canvas(self, width=200, height=150, bg='light green')
            can.pack()
     
            # Forçage de la géométrie de la fenêtre
            self.master.geometry('220x160+10+10')
     
    class AppliPartic(AppliBase):
        def __init__(self):
            AppliBase.__init__(self)
            self.pack()
     
            Label(self, text='coucou', bg='yellow').pack()
     
            # Forçage du calcul de la geometrie
            self.master.update_idletasks()
     
            # Forçage de l'affichage
            self.master.update()
     
            # Récupération des dimensions de la fenêtre
            w, h = self.master.winfo_width(), self.master.winfo_height()
     
            # Redimensionnement de la fenêtre
            self.master.geometry("{}x{}+{}+{}".format(w, h, 10, 10))
     
    #--------------------- Lancement ---------------------
    if __name__ == '__main__':
        AppliPartic().mainloop()
    Je ne sais pas quelles instruction utiliser dans AppliPartic pour redimensionner la fenêtre correctement ...

    Merci pour votre aide

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    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 743
    Par défaut
    Salut,

    Dans AppliPartic, vous imposez une fenêtre de 220x160.
    Si les widgets que vous placez dans cette fenêtre sont plus grands, que faire?
    1. afficher une "view" de ce qui entre dans 220x160?
    2. redimensionner les width et height de la fenêtre pour rendre les widgets visibles?

    Si le monsieur dit "fenêtre de 220x160", la machine fait.

    Je ne sais pas quelles instruction utiliser dans AppliPartic pour redimensionner la fenêtre correctement
    Par défaut, "pack" se débrouille pour dimensionner la fenêtre de sorte a montrer tous les widgets qui ont été "packes" dedans. Je n'ai pas compris pourquoi vous vouliez changer ce défaut (pour obtenir quoi?).

    Plus cosmétique.
    Vous êtes libre de distribuez vos instructions comme vous voulez. Ceci dit, avoir des classes qui se réduisent a des constructeurs qui s’appellent en cascade n'aide pas a la lecture de votre code. En plus ces in-directions n'apportent rien a la compréhension du problème.

    Pourquoi ne pas écrire plus simplement:

    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
    import tkinter as tk
     
    def start(app):
        frame = tk.Frame(app, bg='pink')
        tk.Canvas(frame, width=200, height=150, bg='light green').pack()
        tk.Label(frame, text='coucou', bg='yellow').pack()
        return frame
     
    if __name__ == '__main__':
        app = tk.Tk()
        widget = start(app)
        widget.pack()
        print ('before update: width=%s, height=%s' % (app.winfo_width(), app.winfo_height()))
        app.update()
        print ('before update: width=%s, height=%s' % (app.winfo_width(), app.winfo_height()))
        app.mainloop()
    1. "import tkinter as tk" est une bonne habitude a prendre,
    2. AppliPartic a le temps de devenir s/classe de s/classe de Frame. "start(app)" pour l'instant, c'est "good enough". Le jour ou AppliPartic se justifiera, ça retournera toujours un widget.
    3. Je préfère mettre la disposition (.pack) cote "parent". Techniquement ça n'a aucune importance. Mais le jour ou les choses vont devenir plus compliquées, vous allez mélanger .grid et .pack et perdre un temps fou a comprendre pourquoi ça m...


    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre confirmé Avatar de Pierrot92320
    Homme Profil pro
    Ingénieur en retraite (électronique)
    Inscrit en
    Avril 2009
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur en retraite (électronique)
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2009
    Messages : 159
    Par défaut
    Bonjour wiztricks, je te remercie pour ta réponse. J'ignorais que geometry avait un effet définitif et empêchait pack() de redimensionner la fenêtre, c'est la réponse à mon questionnement. Je n’utiliserais donc plus la méthode geometry inconsidérément.

    Mais alors comment puis-je faire pour demander à la fenêtre de s'ouvrir en haut à gauche de l'écran, aux coordonnées (x, y) = (10, 10) ? Cela me gêne en effet de voir la fenêtre Tk s'ouvrir au milieu de l'écran.

    D'ailleurs je trouve que mon environnement de développement n'est pas très commode. Il se résume en fait à l'éditeur IDLE. Par exemple actuellement je travaille sur le jeu de bombardes en réseau de (GS) et pour tester correctement l'application il faut lancer un serveur et 2 clients, ce qui donne 9 fenêtres sur l'écran qui s'ouvrent un peu n'importe où. Auxquelles il faut bien sûr ajouter des fenêtres pdf, intenet ou autres pour la documentation ... Il faudrait 2 ou 3 écrans sur mon PC :o) Connais-tu un environnement de travail simple et plus commode ?

    Enfin une dernière question. Pourrais-tu développer ce que tu as dit ici :

    Citation Envoyé par wiztricks Voir le message
    Je préfère mettre la disposition (.pack) cote "parent"...
    Ah oui une autre dernière. Je vais essayer de m'habituer à < import tkinter as tk >. Mais je peux ajouter < from tkinter.constants import * > ?

    P.S. L'exemple que j'ai donné était simplifié à l’extrême. En réalité AppliBase est la classe AppBombardes du module canon03.py (300 lignes) et AppliPartic est la classe AppServeur du fichier canon_serveur.py (285 lignes). Comme j'avais inséré la méthode geometry dans le constructeur de AppBombardes (pour positionner la fenêtre Tk sur l'écran), ça me donne le pb que j'ai exposé lorsque AppServeur appelle AppBombardes.

    Merci pour ton aide

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    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 743
    Par défaut
    Salut,

    Mais alors comment puis-je faire pour demander à la fenêtre de s'ouvrir en haut à gauche de l'écran, aux coordonnées (x, y) = (10, 10) ? Cela me gêne en effet de voir la fenêtre Tk s'ouvrir au milieu de l'écran.
    .geometry etait bien vu, mais il faut l'utiliser comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import tkinter as tk
     
    if __name__ == '__main__':
        app = tk.Tk()
        tk.Button(text='next', command=app.quit).pack()
     
        app.geometry('+%d+%d' % (10, 10))
        app.mainloop()
     
        app.geometry('+%d+%d' % (100, 100))
        app.mainloop()
    Il faudrait 2 ou 3 écrans sur mon PC :o) Connais-tu un environnement de travail simple et plus commode ?
    Internet permet de se passer de documentations "papier" mais travailler avec 2 écrans n'est pas du luxe.
    1. les écrans plats sont abordables,
    2. les cartes graphiques le supportent,
    3. et Windows 7 le permet via "connecter un projecteur",


    Par contre:
    D'ailleurs je trouve que mon environnement de développement n'est pas très commode. Il se résume en fait à l'éditeur IDLE. Par exemple actuellement je travaille sur le jeu de bombardes en réseau de (GS) et pour tester correctement l'application il faut lancer un serveur et 2 clients, ce qui donne 9 fenêtres sur l'écran.
    ah ben ouais, c'est l'enfer...
    Ceci dit, ce sont des applications réseau.
    Si vous avez du courage (et du temps et si votre PC a des muscles), récupérez VirtualBox.
    Vous créez 3 VM dans lesquelles vous installez l'OS de votre choix connecte par un réseau "host-only".
    2 clients + 1 serveur = 3 windows qui gèrent leurs collections de fenêtres.

    Sur les wm X11, il y a une fonctionnalité qui permet d'avoir N virtual desktops: on a la possibilité de placer ou de démarrer une application "dans" un de ces écrans et une commande permet de "switcher" de l'un a l'autre.
    Sur Windows, la fonctionnalité n'existe pas de base mais il y a plein de freeware pour la mettre en route.
    C'est ce qu'on faisait "avant" de pouvoir héberger un petit centre de calcul sur son portable.

    Enfin une dernière question. Pourrais-tu développer ce que tu as dit ici :

    Je préfère mettre la disposition (.pack) cote "parent"...
    L’expérience... mais, aujourd'hui je n'ai pas le temps.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre confirmé Avatar de Pierrot92320
    Homme Profil pro
    Ingénieur en retraite (électronique)
    Inscrit en
    Avril 2009
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur en retraite (électronique)
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2009
    Messages : 159
    Par défaut
    Merci wiztricks pour ces infos.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Windows 64 bits: Problème de redimensionnement des fenêtres
    Par Pascal Jankowski dans le forum Contribuez
    Réponses: 6
    Dernier message: 28/06/2013, 16h30
  2. Problème de redimensionnement de fenêtre
    Par Burton's91 dans le forum Tkinter
    Réponses: 2
    Dernier message: 25/06/2013, 21h33
  3. Réponses: 2
    Dernier message: 01/11/2011, 16h31
  4. Problèmes de DIV+FLOAT avec redimensionnement de fenêtre
    Par blbird dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 09/02/2009, 14h40
  5. Réponses: 3
    Dernier message: 05/07/2006, 23h02

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