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 :

ttk et labeledscale - Comment ça marche?


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 65
    Par défaut ttk et labeledscale - Comment ça marche?
    Bonjour à tous,

    Je suis actuellement en train de suivre le livre de G.Swinnen sur Pytohn en l'adaptant à la sauce ttk (car je trouve le thème Tkinter de base vraiment très vilain).

    Sauf que je bute sur l'utilisation du widget "labeledscale" destiné à remplacer le widget "scale".
    Il est noté comme extension du widget ttk "scale" mais je n'arrive à faire rien d'autres que choisir de mettre le texte de la valeur courant au-dessus ou en-dessous du curseur.

    Voici le code d'origine
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    from tkinter import *
     
    def updateLabel(x):
        lab.configure(text='Valeur actuelle = ' + str(x))
     
    root = Tk()
    xx = Scale(root, length=250, orient=HORIZONTAL, label='Réglage:', troughcolor="dark grey", sliderlength="20",\
               showvalue='0', from_=-25, to=125, tickinterval=25, command=updateLabel)
    xx.pack()
    lab = Label(root)
    lab.pack()
    root.mainloop()
    Voici le mieux que j'arrive faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    from tkinter import *
    from tkinter import ttk
     
    def updateLabel(x):
        lab.configure(text='Valeur actuelle = ' + str(x))
     
    root = Tk()
    xx = ttk.LabeledScale(root, from_=-25, to=125, compound="bottom")
    xx.pack()
    lab = Label(root)
    lab.pack()
    root.mainloop()
    On remarque que quasiment aucune fonction de scale n'est valable, pire même la fonction "command" passe à la trappe et pour le fun, un petit bug graphique lorsque le curseur arrive au milieu, le texte semble masqué par quelque chose. J'ai beau Googler pour trouver des exemples, cette fonction n'est que très peu documentée (je suis gentil là :p )

    Voilà, si quelqu'un sait comment utiliser ce widget ttk, je suis pas contre une explication de texte. Merci d'avance à vous.

    Cordialement,
    Damien

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

    stricto sensu, ttk.Scale devrait remplacer tk.Scale.
    ttk.LabeledScale n'est pas un widget "ttk" a proprement parler, c'est un widget Python qui bouche un des nombreux trous de ttk.Scale (compare a tk.Scale): afficher la valeur courante.
    Les "trous" étant l'ensemble des options qu'on peut préciser a tk.Scale et qui sont absentes de ttk.Scale.
    Dans la pratique comment on joue avec?
    tk.Scale: le code reprend le votre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import tkinter as tk
    from tkinter.constants import *
    import tkinter.ttk as ttk
     
    def use_tk_widgets(app):
        scale_cfg = dict(
            length=250, orient=HORIZONTAL,
            label='Réglage:', troughcolor="dark grey",
            sliderlength="20", showvalue='0',
            from_=-25, to=125, tickinterval=25)
     
        return tk.Scale(app, scale_cfg, command=update_label)
    ttk.Scale: moins d'options mais toujours "command".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def use_ttk_widgets(app):
        scale_cfg = dict(from_=-25, length=250, orient=HORIZONTAL, to=125, value=0)
        return ttk.Scale(app, command=update_label, **scale_cfg)
    ttk.LabeledScale est un tk.Frame dans lequel on été créés un ttk.Scale et un ttk.Label. Le Label affiche la valeur du "scale".
    Si vous voulez garder update_label, il faut définir le callback update_label en accédant a l'attribut "scale" de l'objet crée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def use_ttk_labeledscale(app):
        w = ttk.LabeledScale(app, from_=-25, to=125)
        w.scale['command'] = update_label
        return w
    Pour jouer avec chaque widgets:
    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
    def update_label(x):
        label['text'] = 'Valeur actuelle: %s' % x
     
    if __name__ == '__main__':
     
        app = tk.Tk()
        app.geometry('300x200')
        tk.Button(text='next', command=app.quit).grid(row=0)
        label = tk.Label()
        label.grid(row=2)
     
        for start in use_tk_widgets, use_ttk_widgets, use_ttk_labeledscale:
            w = start(app)
            w.grid(row=1)
            update_label(0)
            app.mainloop()
            w.destroy()
    remplacer les widgets tk par ceux de ttk n'est pas toujours une bonne idée d'autant qu'ils se mélangent assez bien.

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

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 65
    Par défaut
    Merci pour votre réponse si rapide.

    Donc, en définitive, si j'ai bien compris, cela veut aussi dire qu'à l'heure actuelle, impossible d'obtenir le même rendu que tk.scale avec ttk.scale :.(
    Le seul "plus" de labeledscale, c'est l'affichage de la valeur courante et a moins de créer son propre widget, avec par exemple, l'affichage d'intervalles significatifs (0,5,10,...) avec plusieurs labels, point de salut.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 65
    Par défaut
    Suite au problème ci-dessus, je me suis mis en tête de créer mon propre widget.
    Je suis arrivé à des résultats intéressants mais je bloque sur le positionnement précis des labels qui indique la postion du curseur le long de la glissière.

    Lorsque le curseur arrive en face d'une valeur, par exemple 300, la méthode scale.get() renvoi une valeur proche (par exemple:314) mais pas 300.
    Les labels sont légèrement décalés et après plusieurs essais infructueux, j'aurai bien besoin d'une explication.
    Il doit y avoir quelque chose de particulier à savoir su le positionnement du label mais impossible de mettre la main dessus. En tout cas, cela se joue à quelques pixels.

    Ci-dessous, une version simplifiée pour illustrer le 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
    from tkinter import *
    from tkinter import ttk
     
    def update(x):
        print(scale.get())
     
    settings = [0,500,100]
    interval = int((settings[1]-settings[0])/settings[2])
     
    root = Tk()
    # Création du widget Scale
    scale = ttk.Scale(root, from_=settings[0], to=settings[1], length=500, command=update)
    scale.grid(row=1, column=1, rowspan=1, columnspan=interval+1, sticky=EW)
     
    # Définition du label de départ
    start = ttk.Label(text='0')
    start.grid(row=0, column=1, sticky=W)
     
    # Définition des labels intermediaires
    for i in range(0,interval-1,1):
        z = ttk.Label(root,text=str(round(settings[0]+settings[2]*(i+1),0)))
        z.place(x=(settings[2]*(i+1)), y=0)
     
    # Définition du label de fin
    finish = ttk.Label(root, text=str(settings[1]))
    finish.grid(row=0, column=interval+1, sticky=E)
     
    root.mainloop()
    Merci d'avance pour votre aide.
    Damien

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

    C'est plutôt prise de chou avec papier millimètre et/ou un Canvas dans lequel on construit une réglette avec des labels au dessus.
    Sans oublier d'entrer dans les détails sur la gestion des bords (si on les voit, ils ont une épaisseur).

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

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 65
    Par défaut
    Bonjour,

    Je vais essayé de potasser cela, j'ai trouvé une piste mais qui ne semble fonctionner que sur des ensembles positifs.
    Je verrai.

    Merci pour la réponse, on se sent moins seul

Discussions similaires

  1. ToAsciiEx, comment cela marche ?
    Par mikyfpc dans le forum C++Builder
    Réponses: 2
    Dernier message: 17/02/2004, 21h39
  2. [MFC] list box : comment ça marche
    Par runn2 dans le forum MFC
    Réponses: 4
    Dernier message: 28/01/2004, 12h36
  3. [SYNEDIT] -> Comment ça marche ?
    Par MaTHieU_ dans le forum C++Builder
    Réponses: 2
    Dernier message: 18/01/2004, 19h11
  4. [TP][Turbo Vision] comment ça marche ??
    Par Costello dans le forum Turbo Pascal
    Réponses: 7
    Dernier message: 05/08/2003, 00h24
  5. [update][req. imbriquee] Comment ca marche ??
    Par terziann dans le forum Langage SQL
    Réponses: 3
    Dernier message: 11/07/2003, 12h51

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