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

Python Discussion :

Savoir par un script si un widget est ou n'est pas visible à l'écran


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 64
    Par défaut Savoir par un script si un widget est ou n'est pas visible à l'écran
    Ne me dites pas s'il vous plaît que je n'ai qu'à mettre des lunettes.
    J'ai un script qui fabrique 15 labels
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    hold = [ ]
    for x in range(15):
        hold.append(Tk.Label(fen1))
        hold[x] = Tk.Label(fen1, text="HOLD", fg="red", bg="black",
                      font=tkFont.Font(family="Courier 12 Pitch", size=18, weight="bold"))
    ces Labels sont positionnés individuellement via la méthode place, par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hold[3].place(x=360,y=500)
    ou cachés par

    Ce que je voudrais savoir faire c'est questionner dans le script un (ou plusieurs) Label en particulier pour savoir
    s'ils est "visible" ou non, c'est à dire présent ou absent de l'écran.
    Autrement dit quel "attribut ou propriété" du widget permet de détecter sa présence effective.
    J'ai utilisé des Labels, mais je peux utiliser si c'est plus facile des Button ou des Canvas....
    Je sais qu'il me suffirait dans la liste hold de marquer par un 1 ou un 0 l'état visible ou non du label considéré ou de créer un dictionnaire avec un clé "visible" et son état. Mais j'aimerais que ce soit le label lui même qui me parle.
    Merci de vos réponses.

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 814
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par azad2b Voir le message
    Ne me dites pas s'il vous plaît que je n'ai qu'à mettre des lunettes.
    Ah, de l'humour. J'aime bien
    En plus tu as veillé à indenter ton code pour qu'il ressorte bien, ça c'est sympa. Juste que tu te serais baladé sur le forum tu aurais vu comment font les autres. Ils utilisent les balises [code] et [/code] et plus de souci.

    Citation Envoyé par azad2b Voir le message
    Ce que je voudrais savoir faire c'est questionner dans le script un (ou plusieurs) Label en particulier pour savoir
    s'ils est "visible" ou non, c'est à dire présent ou absent de l'écran.
    Autrement dit quel "attribut ou propriété" du widget permet de détecter sa présence effective.
    Personnellement je n'utilise pas tk mais Qt. Et sous cette librairie, les objets possèdent une propriété isVisible() (ainsi que son opposée isHidden() ce qui m'étonne un peu mais bon...). A mon avis, tk, même si son principe n'est pas le même, doit quand-même avoir des propriétés similaires...

    Sinon j'ai trouvé un truc ici: https://stackoverflow.com/questions/...get-is-visible...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 64
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour
    Sinon j'ai trouvé un truc ici: https://stackoverflow.com/questions/...get-is-visible...
    Hélas cela m'envoie une erreur issue, non du script, mais de l'interpréteur Python lui-même. L'option "isvisible" bien que très prometteuse d'après sa syntaxe semble inconnue par tkinter. Mais je vais tenter le coup avec Qt
    Merci en tout cas, de ta réponse.

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

    Les méthodes à utiliser sont .winfo_isvisible ou .winfo_viewable (et on regarde la documentation pour voir ce que ça fait et on teste...)

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

  5. #5
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 64
    Par défaut
    Hello wiztricks
    Bien mais j'ai deux problemes
    Le premier est que .winfo_viewable semble fonctionner sous tkinter, (pas .winfo_isvisible mais ce n'est pas important)
    par contre ( je vous rappelle que j'ai des Labels qui sont les objets de la liste hold[ ] formée de 15 éléments. Ces labels ont définis dans un module appelé gui.py sous la définition

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hold[x] = Tk.Label(fen1, text="HOLD", fg="red", bg="black",font=tkFont.Font(family="Courier 12 Pitch", size=18, weight="bold"))
    or si dans mon script principal je fais ce test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i in range(0,5):
        print(hold[i].winfo_viewable)
    la réponse est
    <bound method Misc.winfo_viewable of <tkinter.Label object .!label2>>
    <bound method Misc.winfo_viewable of <tkinter.Label object .!label4>>
    <bound method Misc.winfo_viewable of <tkinter.Label object .!label6>>
    <bound method Misc.winfo_viewable of <tkinter.Label object .!label8>>
    <bound method Misc.winfo_viewable of <tkinter.Label object .!label10>>
    Ne suis-je pas en droit de me poser des questions sur le fait que l' interpréteur à renommé mes labels à sa guise.
    En outre j'ai fait ce test dans la boucle ou sont affichés les labels en question et ma question n'est pas de savoir s'ils sont visibles, mais bien s'ils sont affichés.
    Donc j'admet que wiewable n'est pas assez précis il doit y avoir mieux
    Maintenant, une question plus générale, j'ai noté chez vous le conseil pertinent et constant de consulter la documentation, ce qui est très sage. J'ai une doc de tkinter qui fait 360 pages. Pouvez-vous me donner un lien pour mieux que ce dont je dispose ? Merci d'avance

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 690
    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 690
    Par défaut
    Citation Envoyé par azad2b Voir le message
    Le premier est que .winfo_viewable semble fonctionner sous tkinter, (pas .winfo_isvisible mais ce nest pas important).
    Oops, je me suis trompé, c'est .winfo_ismapped mais comme vous avez ouvert la documentation...

    Citation Envoyé par azad2b Voir le message
    or si dans mon script principal je fais ce test
    .winfo_ismapped ou .winfo_viewable sont des méthodes. Elles retournent une information lorsqu'elles sont appelée.
    Et comment on appelle une fonction/méthode est ce que vous devez avoir appris avant de vous aventurer dans tkinter...

    Citation Envoyé par azad2b Voir le message
    Ne suis-je pas en droit de me poser des questions sur le fait que l' interpréteur à renommé mes labels à sa guise.
    Qu'appelez vous le nom du Label?
    Ici vous montrez une information construite via la méthode repr appliquée à cette méthode là...
    Ca se retrouve avec tous les objets:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> def f():pass
    ...
    >>> f
    <function f at 0x0000012763CBE040>
    >>> print(f)
    <function f at 0x0000012763CBE040>
    >>>
    et comme on peut modifier cette sortie pour donner des informations plus "parlantes"...

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

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonsoir !

    Voici une petite suggestion :
    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
    from tkinter import *
     
    def delete():
        l.place_forget()
     
    def test():
        print(l.place_info().__contains__('in'))
     
    root = Tk()
    root.geometry("500x350")
    l = Label(root, text="HOLD")
    l.place(x=250, y=100)
    b1 = Button(root, text="DEL", command=delete)
    b1.place(x=250, y=175)
    b2 = Button(root, text="TEST", command=test)
    b2.place(x=250, y=250)
    root.mainloop()


    Est-ce que ça vous convient ?

    Petite astuce pour trouver des fonctions : print(dir(l))
    Dernière modification par Invité ; 23/12/2021 à 23h11.

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

    Je ne vois pas la difficulté de tester:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> from tkinter import Label
    >>> label = tk.Label()
    >>> label.winfo_viewable()
    0
    >>> label.winfo_ismapped()
    0
    >>> label.pack()
    >>> label.winfo_viewable()
    1
    >>> label.winfo_ismapped()
    1
    Et si on donne un nom au Label, le repr en tiendra compte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> label = tk.Label(name='toto')
    >>> label.winfo_viewable
    <bound method Misc.winfo_viewable of <tkinter.Label object .toto>>
    >>>
    Citation Envoyé par LeNarvalo Voir le message
    Voici une petite suggestion :
    Ca ne répond pas à la question:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    >>> frame = tk.Frame()
    >>> label = tk.Label(frame)
    >>> label.pack()
    >>> label.pack_infos()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'Label' object has no attribute 'pack_infos'
    >>> label.pack_info()
    {'in': <tkinter.Frame object .!frame2>, 'anchor': 'center', 'expand': 0, 'fill': 'none', 'ipadx': 0, 'ipady': 0, 'padx': 0, 'pady': 0, 'side': 'top'}
    >>> label.winfo_ismapped()
    0
    >>> label.winfo_viewable()
    0
    >>>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Invité
    Invité(e)
    Par défaut
    En effet c'était une alternative farfelue comme je les aime, s'il utilise une frame dans ce cas remplacer l.place_info().__contains__('in') par frame.place_info().__contains__('in') and l.place_info().__contains__('in') et ainsi de suite.

  10. #10
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 690
    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 690
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    En effet c'était une alternative farfelue comme je les aime...
    Ah super! Pensez vous que faire le guignol... aide beaucoup?
    En plus 'in' in l.place_info() est quand même plus digeste que l.place_info().__contains__('in')...

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

  11. #11
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Ah super! Pensez vous que faire le guignol... aide beaucoup?
    En plus 'in' in l.place_info() est quand même plus digeste que l.place_info().__contains__('in')...

    - W


    Ben oui ! Ca permet de voir la chose d'une façon plus amusante, après chacun ses goûts, toi visiblement tu préfères rouler des mécaniques...

Discussions similaires

  1. [XL-2013] Comment savoir si une ligne est totalement visible à l'écran ?
    Par CognitiKom dans le forum Macros et VBA Excel
    Réponses: 75
    Dernier message: 29/11/2016, 19h28
  2. Réponses: 4
    Dernier message: 10/04/2010, 14h01
  3. Détecter un bug qui n'est pas visible par tous
    Par Droïde Système7 dans le forum Débuter
    Réponses: 9
    Dernier message: 01/04/2009, 19h17
  4. Tabulation croisée n'est pas visible
    Par Kihmé Xs dans le forum iReport
    Réponses: 2
    Dernier message: 09/04/2008, 10h36
  5. Réponses: 3
    Dernier message: 16/09/2006, 18h08

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