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 :

grid Method? CustomTkinter je ne comprends pas bien


Sujet :

Tkinter Python

  1. #1
    Membre averti
    Homme Profil pro
    Amateur
    Inscrit en
    Mars 2022
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Mars 2022
    Messages : 15
    Par défaut grid Method? CustomTkinter je ne comprends pas bien
    Bonjour à tous... je cherche depuis pas mal de temps, mais je ne trouve pas de solution à mon problème, j'utilise la bibliothèque Customtkinter, et j'ai créer une class d'objet héritant du ctKFrame, qui contient deux labels l'un à la suite de l'autre,

    j'aimerais les integrer dans un Frame, et qu'il s'etendent sur toute la largeur du Frame, sticky='ew', mais pas moyen, je cherche, je cherche, mais je ne trouve pas... un bout de mon code ci dessous, si vous avez une idée...

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    from typing import Tuple
    import customtkinter as ctk
     
    class AppLabel(ctk.CTkLabel):
        def __init__(self, parent, text, size, color='black'):
            if size == 'titre':
                font = ('Arial Black', 22, 'bold')
            elif size == 'categorie':
                font = ('Arial', 20, 'underline')
            elif size == 'attribut':
                font = ('Arial', 20)
            else:
                font = ('Arial', 14)  # Taille par défaut si aucune correspondance n'est trouvée
     
            super().__init__(parent, text=text, font=font, text_color=color)
     
    class LabeledLabel(ctk.CTkFrame):
        def __init__(self,parent,text_label,size,color='black',value='',btn=False):
     
     
            super().__init__(parent)
            self.master=parent
            self.configure(border_color='white',border_width=2,fg_color='red')
     
            self.label=AppLabel(self,text=text_label,size=size,color=color)
            self.value=AppLabel(self,text=value,size=size,color=color)
            self.label.grid(row=0,column=0,padx=5,pady=5,sticky='w')
            self.value.grid(row=0,column=1,padx=5,pady=5,sticky='e')
            self.grid_columnconfigure(0, weight=1)
            if btn:
                self.btn=ctk.CTkButton(self,text='Search',height=18,width=18)
                self.btn.grid(row=0,column=2,padx=5,pady=5)
     
     
    class Win(ctk.CTkFrame):
        def __init__(self, master: any, width: int = 200, height: int = 200, corner_radius: int | str | None = None, border_width: int | str | None = None, bg_color: str | Tuple[str, str] = "transparent", fg_color: str | Tuple[str, str] | None = None, border_color: str | Tuple[str, str] | None = None, background_corner_colors: Tuple[str | Tuple[str, str]] | None = None, overwrite_preferred_drawing_method: str | None = None, **kwargs):
            super().__init__(master, width, height, corner_radius, border_width, bg_color, fg_color, border_color, background_corner_colors, overwrite_preferred_drawing_method, **kwargs)
            self.columnconfigure(0,minsize=500)
            self.columnconfigure(1,weight=2)
            self.rowconfigure(0,weight=1)
            self.rowconfigure(1,weight=1)
            self.rowconfigure(2,weight=1)
     
     
     
            self.frame00=ctk.CTkFrame(self,fg_color='blue')
            self.frame00.grid(row=0,column=0,sticky='nsew')
            self.code_fournisseurlab=LabeledLabel(self.frame00,text_label='code fournisseur',size='attribut',btn=True)
            self.code_fournisseurlab.grid(row=0,column=0,padx=5,pady=5,sticky='ew')
     
     
     
     
    root=ctk.CTk()
    root.title('test')
    root.geometry('+0+0')
    window=Win(root)
     
    window.pack()
     
    root.mainloop()

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

    Déjà simplifier le code pour illustrer le problème à résoudre eventuellement avec tkinter seul (puisque ça parle de grid)...

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

  3. #3
    Membre averti
    Homme Profil pro
    Amateur
    Inscrit en
    Mars 2022
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Mars 2022
    Messages : 15
    Par défaut
    j'ai simplifier le code, mais je rencontre toujours le même problème avec Tkinter, ci dessous le code simplifié:
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    from typing import Tuple
    import tkinter as tk
     
    class AppLabel(tk.Label):
        def __init__(self, parent, text, size, color='black'):
            if size == 'titre':
                font = ('Arial Black', 22, 'bold')
            elif size == 'categorie':
                font = ('Arial', 20, 'underline')
            elif size == 'attribut':
                font = ('Arial', 20)
            else:
                font = ('Arial', 14)  # Taille par défaut si aucune correspondance n'est trouvée
     
            super().__init__(parent, text=text, font=font)
     
    class LabeledLabel(tk.Frame):
        def __init__(self,parent,text_label,size,color='black',value='',btn=False):
            super().__init__(parent)
            self.master=parent
            self.config(background='blue')
            self.label=AppLabel(self,text=text_label,size=size,color=color)
            self.value=AppLabel(self,text=value,size=size,color=color)
            self.label.grid(row=0,column=0,padx=5,pady=5,sticky='w')
            self.value.grid(row=0,column=1,padx=5,pady=5,sticky='e')
            self.grid_columnconfigure(0, weight=1)
            if btn:
                self.btn=tk.Button(self,text='Search',height=18,width=18)
                self.btn.grid(row=0,column=2,padx=5,pady=5,sticky='e')
     
     
    class Win(tk.Frame):
        def __init__(self, master=None, **kwargs):
            super().__init__(master, **kwargs)
            self.columnconfigure(0, minsize=800)
            self.columnconfigure(1, weight=2)
            self.rowconfigure(0, weight=1)
            self.rowconfigure(1, weight=1)
            self.rowconfigure(2, weight=1)
     
            self.frame00 = tk.Frame(self,background='red')
            self.frame00.grid(row=0, column=0, sticky='nsew')
            self.code_fournisseurlab = LabeledLabel(self.frame00, text_label='code fournisseur', size='attribut', btn=True)
            self.code_fournisseurlab.grid(row=0, column=0, padx=5, pady=5, sticky='ew')
     
     
    root = tk.Tk()
    root.title('test')
    root.geometry('+0+0')
    window = Win(root)
     
    window.pack()
     
    root.mainloop()

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 704
    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 704
    Par défaut
    Citation Envoyé par onlyforpeace Voir le message
    j'ai simplifier le code, mais je rencontre toujours le même problème avec Tkinter, ci dessous le code simplifié
    Le problème initial est décrit par:
    Citation Envoyé par onlyforpeace Voir le message
    ...deux labels... j'aimerais les integrer dans un Frame, et qu'il s'etendent sur toute la largeur du Frame, sticky='ew', mais pas moyen
    On a donc deux Labels ayant pour parent une Frame qui sera peut être intégrés dans une autre Frame... Pas besoin de classe et de 60 lignes de code pour créer et agencer 4 widgets! On peut commencer avec:
    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
     
    root = tk.Tk()
    f1 = tk.Frame(root,bg='red')
    f2 = tk.Frame(f1,bg='blue')
    tk.Label(f2, text='*'*5,bg='white').grid(sticky='ew')
    tk.Label(f2, text='*'*10,bg='white').grid(sticky='ew')
    f2.columnconfigure(0, weight=1)
    f2.pack(fill='x')
    f1.pack(fill='x')
    tk.mainloop()
    qui traduit ce que j'en ai compris... en 10 lignes.

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

  5. #5
    Membre averti
    Homme Profil pro
    Amateur
    Inscrit en
    Mars 2022
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Mars 2022
    Messages : 15
    Par défaut
    merci, je comprends bien ce que tu dis, mais, la totalité de mon code s'étend sur plus de 2 à 3000 lignes, ici il n'y a qu'une toute petite partie isolé... la class labeledlabel, est utilisé dans plein d'onglet différents de mon application... d'ailleurs je n'ai pas que la class labeledlabel, ce genre de class ce decline en labeledentry, puis labeledcombobox, puis labeledtextbox... en fait je ne cherche pas à simplifier mon code, mon code est tel qu'il est parce qu'il est comme ça, je cherche juste à comprendre pourquoi je n'arrive pas à étendre ce widget héritant de la class frame avec sticky='ew' comme ça pourrait le faire avec un widget entry...

    je viens de faire des essai avec seulement tkinter, et il me semble que j'ai trouver l'endroit où ça n'allait pas... mais ça ne règle pas le problème avec customtkinter... je cherche encore...

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 704
    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 704
    Par défaut
    Citation Envoyé par onlyforpeace Voir le message
    merci, je comprends bien ce que tu dis, mais, la totalité de mon code s'étend sur plus de 2 à 3000 lignes, ici il n'y a qu'une toute petite partie isolé...
    Un détail d'implémentation se travaille sur quelques lignes où on se focalise sur le détail et pas sur un machin où on ne sait pas trop quoi regarder.

    Quand on est arrivé à le faire marcher (en comprenant le pourquoi) on peut éventuellement retravailler ces lignes pour se rapprocher de l'interface qu'en attend le programme dans lequel on va l'intégrer.

    Dit autrement, qu'à la fin le programme fasse 10 lignes ou 3000, çà reste un travail de composition de détails... où il faut faire la différence entre la maîtrise des fonctionnalités des bibliothèques qu'on utilise et les effets de bords d'une organisation pas toujours appropriée (mais ranger proprement son code n'est pas un sujet python).

    note: à part préfixer les widgets par CTk et supprimer les bg=... mon code fonctionne aussi bien avec CTk.... Et vous n'avez toujours pas exposé simplement votre problème avec le code qui va avec.

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

  7. #7
    Membre averti
    Homme Profil pro
    Amateur
    Inscrit en
    Mars 2022
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Mars 2022
    Messages : 15
    Par défaut
    Ok, merci pour le temps passé, mais j'ai trouvé... il manquait un .columnconfigure(0,weight=1) sur mon frame00.

    à bientôt...

    Dois je comprendre que mon code est "mal" rangé?

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 704
    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 704
    Par défaut
    Citation Envoyé par onlyforpeace Voir le message
    Ok, merci pour le temps passé, mais j'ai trouvé... il manquait un .columnconfigure(0,weight=1) sur mon frame00.
    Je vous ferais remarqué qu'il est dans mon petit exemple de code qui essaie juste de fabriquer ce que vous avez décrit.

    Citation Envoyé par onlyforpeace Voir le message
    Dois je comprendre que mon code est "mal" rangé?
    A partir du moment où vous vous y noyez... et que vous ne pouvez plus prendre de recul vs. des détails de réalisation, non seulement il est mal rangé mais en plus il vous bouffe le cerveau (vous empeche de réflechir).

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/07/2020, 22h08
  2. Réponses: 9
    Dernier message: 04/12/2015, 23h44
  3. Je ne comprends pas bien les variables d'envrionnement
    Par GérardMartinelli dans le forum Langage
    Réponses: 7
    Dernier message: 07/01/2015, 16h32
  4. Je ne comprends pas bien drag drop scriptaculous
    Par nono95 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 11/05/2009, 16h39
  5. Réponses: 6
    Dernier message: 31/08/2007, 21h05

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