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 avec l'utilisation de grid


Sujet :

Tkinter Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    Juin 2022
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Juin 2022
    Messages : 5
    Par défaut Problème avec l'utilisation de grid
    Bonjour à tous ! Je suis en train d'écrire un simple téléchargeur de playlist (avec pytube) et je veux m'améliorer sur Tkinter donc j'ai décidé de l'utiliser pour construire une interface. J'ai cependant quelques problèmes avec la gestion de la grid et comment gérer des tailles différentes sur la même colonne mais sur des lignes différentes.

    Voici les parties intéressantes de mon code :

    Fonctions pour placer un widget :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        def initial_configure_widgets(self,
                                      widget: Union[Entry, Label, Progressbar, Button],
                                      parameters: Dict[str, Any],
                                      use_place_method: bool = False) -> None:
            if (use_place_method):
                widget.place(**parameters)
            else:
                widget.grid(**parameters)
    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
    def format_widget_parameters(row: int,
                                 column: int,
                                 padx: Tuple[int, int],
                                 pady: Tuple[int, int],
                                 sticky: str,
                                 columnspan: int = 1) -> Dict[str, Any]:
        parameters = {
            "row": row,
            "column": column,
            "padx": padx,
            "pady": pady,
            "sticky": sticky,
            "columnspan": columnspan
        }
        return parameters
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        def configure_grid(self,
                           is_row: List[bool] = [True],
                           index: List[int] = [0],
                           weight: List[int] = [0]) -> None:
     
            if len(is_row) != len(index) != len(weight):
                raise ValueError("All three lists must have the same length.")
     
            for i in range(len(is_row)):
                if is_row[i]:
                    self.root.grid_rowconfigure(index[i], weight=weight[i])
                else:
                    self.root.grid_columnconfigure(index[i], weight=weight[i])
    Et comment je les utilise

    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
            # **** GRID CONFIGURATION****
        application.configure_grid([False, False, False, True, True, True, True, True, True, True, True],
                                   [0,         1,     2,    0,    1,    2,    3,    4,    5,    5,    6],  # noqa
                                   [0,         0,     1,    0,    0,    0,    0,    0,    0,    0,    0])
     
        application.initial_configure_widgets(
            download_label, format_widget_parameters(0, 2, (0, 0), (20, 10), "s"))
        application.initial_configure_widgets(
            download_entry, format_widget_parameters(1, 2, (0, 0), (10, 0), "new"))
        application.initial_configure_widgets(
            playlist_button, format_widget_parameters(1, 0, (10, 0), (5, 0), "ew"))
        application.initial_configure_widgets(
            audio_button, format_widget_parameters(1, 1, (0, 10), (5, 0), "ew"))
        application.initial_configure_widgets(
            download_button, format_widget_parameters(2, 2, (0, 0), (5, 0), ""))
        application.initial_configure_widgets(
            download_progressbar, format_widget_parameters(3, 2, (0, padx_west_init), (30, 0), "new"))
        application.initial_configure_widgets(
            folder_button, format_widget_parameters(4, 0, (10, 0), (40, 0), "ew"))
        application.initial_configure_widgets(
            error_canvas, format_widget_parameters(5, 0, (50, 50), (20, 0), "new", 3))
        application.initial_configure_widgets(
            error_label, {'relx': 0, 'rely': 0.5, 'anchor': 'center'}, True)
        application.initial_configure_widgets(
            name_label, format_widget_parameters(6, 0, (0, 0), (0, 0), "nw", 3))
        application.initial_configure_widgets(
            name_entry, format_widget_parameters(6, 1, (20, 0), (0, 0), "n", 3))

    Cela fonctionnait correctement lorsque je n'avais pas placé name_label et name_entry, mais après les avoir placés, ça ne fonctionne plus. Mon texte dans name_label est large et j'ai donc besoin de mettre un columspan de 3 pour éviter de changer la taille du widget sur la ligne précédente. Pour éviter la superposition de name_entry sur name_label j'ai mis mon name_entry dans la colonne 3 mais il n'est pas directement collé au name_label (j'imagine que c'est parce qu'il est collé à la colonne 2 et que le name_label ne remplit pas entièrement les colonnes 0, 1 et 2), savez-vous s'il y a un moyen de coller l'élément sur la face est du texte et non de la colonne.

    J'ai aussi cet élément qui a un comportement bizarre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        application.initial_configure_widgets(
        download_entry, format_widget_parameters(1, 2, (0, 0), (10, 0), "new", 3))
    Comme vous pouvez le constater, il existe un padding à l'ouest de download_entry (alors qu'il n'y est pas sans name_label et name_entry) et je ne comprends pas pourquoi ?

    Merci d'avance pour toutes aides

    Sans name_entry/name_label
    Nom : Capture d’écran du 2023-08-03 11-10-01.png
Affichages : 177
Taille : 30,6 Ko

    Avec
    Nom : Capture d’écran du 2023-08-03 09-13-03.png
Affichages : 163
Taille : 46,8 Ko

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

    Regardez la première image (j'imagine que c'est le rendu que vous cherchez à obtenir). Est ce que ça ressemble à un tableau? A mon sens c'est plutôt un empilement de widgets soit directement soit agencés dans une Frame (lorsqu'il y en a plusieurs côte à côte).
    empilement = pack et pour l'agencement dans les Frame, grid ou pack peuvent être utilisés.

    Après bien sûr on peut se prendre le chou à tout vouloir gérer avec grid... mais si vous ne postez pas un exemple complet où on va pouvoir se poser des questions, chercher dans la doc pour comprendre.... pas sur que vous trouviez de l'aide (mais d'autres se manifesteront peut être).

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

  3. #3
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    Juin 2022
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Juin 2022
    Messages : 5
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Regardez la première image (j'imagine que c'est le rendu que vous cherchez à obtenir). Est ce que ça ressemble à un tableau? A mon sens c'est plutôt un empilement de widgets soit directement soit agencés dans une Frame (lorsqu'il y en a plusieurs côte à côte).
    empilement = pack et pour l'agencement dans les Frame, grid ou pack peuvent être utilisés.

    Après bien sûr on peut se prendre le chou à tout vouloir gérer avec grid... mais si vous ne postez pas un exemple complet où on va pouvoir se poser des questions, chercher dans la doc pour comprendre.... pas sur que vous trouviez de l'aide (mais d'autres se manifesteront peut être).

    - W
    Merci pour votre réponse, je trouvais pack pas assez permissif dans la disposition des widgets (notamment à l'heure actuelle j'utilise du padding dynamique quand je change la taille de ma fenêtre et je suis pas sur que ça soit possible avec pack). Et c'est pour ça que je souhaitais apprendre à utiliser grid.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 695
    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 695
    Par défaut
    Citation Envoyé par Nababe Voir le message
    Merci pour votre réponse, je trouvais pack pas assez permissif dans la disposition des widgets
    Je ne comprends pas trop ce que vous entendez par là mais rien ne vous empêche d'utiliser grid à la place de pack pour les empilements horizontaux et verticaux. Ce que j'essaie de vous dire, c'est de fabriquer votre rendu par composition de... plutôt que de vouloir tout réaliser avec un seul geometry manager.

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

  5. #5
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    Juin 2022
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Juin 2022
    Messages : 5
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Je ne comprends pas trop ce que vous entendez par là mais rien ne vous empêche d'utiliser grid à la place de pack pour les empilements horizontaux et verticaux. Ce que j'essaie de vous dire, c'est de fabriquer votre rendu par composition de... plutôt que de vouloir tout réaliser avec un seul geometry manager.

    - W
    C'est ce que je voulais faire au début, mais pack et grid ne sont pas utilisable ensemble :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _tkinter.TclError: cannot use geometry manager pack inside . which already has slaves managed by grid

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 695
    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 695
    Par défaut
    Citation Envoyé par Nababe Voir le message
    C'est ce que je voulais faire au début, mais pack et grid ne sont pas utilisable ensemble :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _tkinter.TclError: cannot use geometry manager pack inside . which already has slaves managed by grid
    Ben oui, c'est pour ça qu'on met des widgets dans des Frames pour faire une colonne de qu'on empile dans une Frame. On hiérarchise... et une Frame où la disposition est gérée par un geometry manager pourra être affichée dans une Frame gérée par un autre GM.
    C'est ce que j'entends par "composer" pour créer le rendu désiré.

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

Discussions similaires

  1. Problème avec l'utilisation de LogMessage
    Par vanquish dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 17/11/2005, 10h18
  2. Problème avec l'utilisation d'un module
    Par goblin dans le forum Modules
    Réponses: 4
    Dernier message: 09/11/2005, 20h55
  3. Problème avec l'utilisation de librairies
    Par Aradesh dans le forum MFC
    Réponses: 3
    Dernier message: 01/08/2005, 15h00
  4. [debutant] problème avec type à utiliser
    Par mlequim dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 15/07/2005, 16h08
  5. Problème avec l'utilisation de la fonction clock
    Par Matgic95 dans le forum C++Builder
    Réponses: 13
    Dernier message: 09/05/2005, 19h27

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