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 :

Positionnement par .grid impossible [Python 2.X]


Sujet :

Tkinter Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Janvier 2016
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Architecte réseau

    Informations forums :
    Inscription : Janvier 2016
    Messages : 36
    Points : 19
    Points
    19
    Par défaut Positionnement par .grid impossible
    Bonjour à tous,

    Je développe actuellement ma première application Python pour monitorer des données en provenance d'un Arduino. Le tout fonctionne plutôt bien, mais je souhaite améliorer l'interface graphique en positionnant mes labels, boutons et graphiques par la méthode .grid


    Voilà à quoi ressemble la fenêtre actuellement
    Nom : Capture.JPG
Affichages : 573
Taille : 84,9 Ko

    et voilà ce que je tente de mettre en place (les labels et boutons de chaque coté du texte "Monitoring Page")
    Nom : Capture 2.JPG
Affichages : 503
Taille : 42,9 Ko

    Je parviens bien à ce que je veux obtenir sur un bout de code à part (voir interface test.py ci-dessous)
    interface test.py

    Mais dés que je tente de l'implanter dans la partie du code qui concerne cette page (class graph_page(tk.Frame) , tout en bas du code, lignes 382 à 399), plus rien ne s'affiche du tout. (voir Data_logger_test.py ci-dessous
    Data_logger_test.py

    J'avoue que je ne comprend pas bien cette partie du code et ses conséquences
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class graph_Page(tk.Frame): # Page of the monitoring graph
     
        def __init__(self, parent, controller):
     
            tk.Frame.__init__(self,parent)
    Une bonne partie du code est héritée des tutos que j'ai suivi sur internet GUIs with Tkinter Le problème c'est qu'il n'a pas été très explicite sur les subtilités de cette partie...

    Je précise que je suis un vrai novice Python. Jusque là je me contentais de bricoler des macros dans Excel et parfois un peu de code pour Arduino... Je me suis mis au Python parce que j'ai besoin de l'outil que je suis en train d'élaborer.

    Par avance merci pour votre aide parce que là... je patauge...

  2. #2
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Salut,

    Comme on ne peut tester ton code, difficile à dire, les premières choses flagrantes sont les multiples instances de Tk et donc autant de mainloop.

    Une autre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for F in (StartPage, graph_Page):
     
                frame = F(container, self)
     
                self.frames[F] = frame
     
                frame.grid(row=0, column=0, sticky="nsew")
    Ici, tu grid tes 2 frames au même endroit.

    Si tu es familier avec les tableurs, considère row et column de grid comme des cellules, le fonctionnement est un peu identique.
    Le temps ronge l'amour comme l'acide.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Janvier 2016
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Architecte réseau

    Informations forums :
    Inscription : Janvier 2016
    Messages : 36
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par bistouille Voir le message
    Salut,

    Comme on ne peut tester ton code, difficile à dire, les premières choses flagrantes sont les multiples instances de Tk et donc autant de mainloop.

    Une autre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for F in (StartPage, graph_Page):
     
                frame = F(container, self)
     
                self.frames[F] = frame
     
                frame.grid(row=0, column=0, sticky="nsew")
    Ici, tu grid tes 2 frames au même endroit.

    Si tu es familier avec les tableurs, considère row et column de grid comme des cellules, le fonctionnement est un peu identique.
    Merci de t'être penché sur la question.

    Flute ! J'avais joint l'intégralité du code pour que justement il puisse être testé. Tant pis...
    Concernant le fonctionnement de la méthode .grid, je pense avoir saisi (après quelques tests voir le fichier joint interface test.py)

    Ce que tu semble avoir remarqué sur les multiples instances de Tk est peut-être à l'origine de mon incompréhension. Je ne comprends pas la façon dont sont "instanciées" les pages (je ne sais pas si c'est le bon terme). L'idée présentée par le gars du tuto est de créer toutes les pages et de les "appeler au dessus" lorsqu'on souhaite les afficher. Je ne sais pas si c'est une pratique courante ou souhaitable. C'est juste que c'est la seule que je connais (mal) pour le moment.

    Si tu as la possibilité de faire tourner mon code, tu verra qu'il n'y a en fait que 2 pages. La page de présentation (qui en fait ne sert pas à grand chose) et la page de monitoring.
    Peut-être faut-il que je réorganise cela d'une façon plus adaptée/conventionnelle. Aurais-tu une source d'info pour cela ?

  4. #4
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Je ne sais pas où tu as vu ce tutoriel, mais ce n'est pas une bonne méthode.

    Soit tu crées tes pages à la volée en détruisant la précédente chaque fois , soit tu gardes tes pages en mémoire (ce qui semble le mieux vu que ça peut mettre du temps à se générer) et tu jongles avec les grid et grid_forget selon la page à afficher.

    Toujours est-il que tes pages devraient chacune être affiliées à une frame comme parent, et non pas à des instances de Tk imbriquées les unes dans les autres.

    Bon, je ne connais pas du tout comment matplotlib s'interface avec tkinter, donc, ce que je dis est peut-être à prendre entre guillemets, mais je pense tout de même que c'est ce qu'il y a de mieux à faire.
    Le temps ronge l'amour comme l'acide.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Janvier 2016
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Architecte réseau

    Informations forums :
    Inscription : Janvier 2016
    Messages : 36
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par bistouille Voir le message
    Je ne sais pas où tu as vu ce tutoriel, mais ce n'est pas une bonne méthode.
    Ok, c'est noté.

    Citation Envoyé par bistouille Voir le message
    Toujours est-il que tes pages devraient chacune être affiliées à une frame comme parent, et non pas à des instances de Tk imbriquées les unes dans les autres.
    Je croyais que c'était justement ce que faisait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class graph_Page(tk.Frame)
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class StartPage(tk.Frame):
    Citation Envoyé par bistouille Voir le message
    Bon, je ne connais pas du tout comment matplotlib s'interface avec tkinter, donc, ce que je dis est peut-être à prendre entre guillemets, mais je pense tout de même que c'est ce qu'il y a de mieux à faire.
    D'après ce que j'ai compris, on crée un "canvas" et on y associe le graph et sa barre d'outils.

    Est-ce que tu aurais une source pour bien comprendre comment agencer les différentes instances de frames pour les pages ?

  6. #6
    Membre à l'essai
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Janvier 2016
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Architecte réseau

    Informations forums :
    Inscription : Janvier 2016
    Messages : 36
    Points : 19
    Points
    19
    Par défaut
    Je vais faire un tour complet du Chapitre 8 : Utilisation de fenêtres et de graphismes puis je reviendrais pour me faire expliquer ce qui m'échappe éventuellement dans les bases.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    C'est bien joli de construire son code grâce a des cut&paste de codes écrits par d'autres mais si au bout du compte, c'est pour ne plus rien maîtriser et se retrouver avec un assemblage difficile à lire (c'est long), difficile à exécuter (il faut un environnement des bibliothèques externes sans rapport avec le problème posé),... ben c'est pas top.

    Donc on prend une longue cuillère et on touille la où il faut: le graphique matplotlib ne s'affiche pas... Regardons pourquoi:
    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
     
    class graph_Page(tk.Frame): # Page of the monitoring graph
     
        def __init__(self, parent, controller):
     
            tk.Frame.__init__(self,parent)
     
            tk.Label(self, text="Monitoring Page", font= LARGE_FONT).pack(pady=10,padx=10)
     
     
     
            canvas = FigureCanvasTkAgg(f, self)
            canvas.show
     
            canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand = True)
    Et l'omission des () à l'instruction canvas.show suffit à expliquer pourquoi.
    Il y a peut être d'autres soucis, mais comme c'est un vrai boulot rien que pour arriver à exécuter le code, il faudra s'en contenter.

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

  8. #8
    Membre à l'essai
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Janvier 2016
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Architecte réseau

    Informations forums :
    Inscription : Janvier 2016
    Messages : 36
    Points : 19
    Points
    19
    Par défaut
    Ok, je viens d'identifier le problème

    Nom : Screenshot-2018-3-28 Apprendre à programmer avec Python.png
Affichages : 768
Taille : 4,2 Ko

    Pour le reste, il me semble l'avoir précisé, je ne fais du python que depuis 1 semaine, alors soyez indulgent... Quand au copier/coller... ben vous les faite comment les tutos que vous suivez vous ? Vous écrivez autre chose que ce qui est demandé ?
    Lorsque j'aurais plus d'expérience, il se peut que je regarde moi aussi ce code avec mépris, mais d'ici là... je fais ce que je peux.

    En tout cas merci d'avoir pris le temps de me répondre et d'avoir attiré mon attention sur la complexité de ce qui m'a été proposé.

    J'apprend...

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par scarou Voir le message
    Ok, je viens d'identifier le problème

    Nom : Screenshot-2018-3-28 Apprendre à programmer avec Python.png
Affichages : 768
Taille : 4,2 Ko.
    Ben si vous utilisez une version récente de Python (i.e. 3.4 ou plus) vous auriez un message d'erreur explicite:
    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
    >>> root = tk.Tk()
    >>> tk.Label().pack()
    >>> tk.Label().grid()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "C:\py_env\py34-64\lib\tkinter\__init__.py", line 2015, in grid_configure
     
        + self._options(cnf, kw))
    _tkinter.TclError: cannot use geometry manager grid inside . which already has s
    laves managed by pack
    >>>
    Et si vous débutez, quelle bonne raison avez vous de ne pas utiliser une version récente (on est bientôt en 3.7!)?

    Pour le reste, il me semble l'avoir précisé, je ne fais du python que depuis 1 semaine, alors soyez indulgent... Quand au copier/coller... ben vous les faite comment les tutos que vous suivez vous ? Vous écrivez autre chose que ce qui est demandé ?
    Lorsque j'aurais plus d'expérience, il se peut que je regarde moi aussi ce code avec mépris, mais d'ici là... je fais ce que je peux.
    Est-ce que vous demandez de l'aide pour comprendre des notions de base du langage ou à écrire un des exercices proposé par un tuto?
    Non. Vous avez posté un assemblage de bouts de code récupérés à gauche et à droite. Ce n'est pas une mauvaise idée car çà évite d'avoir à les écrire et à éventuellement tester... Je le fais tous les jours mais pas lorsque je ne comprends pas ce que fait le code. Et vous savez pourquoi? Parce qu'en cas de problème, il va bien falloir diagnostiquer et pour cela comprendre.... Et s'il y a une revue de code, il faudra aussi pouvoir expliquer le pourquoi de ces choix.
    Dit autrement, recopier pour gagner du temps Ok pour autant que çà reste aussi bien maîtrisé que si vous l'aviez écrit vous même.

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

  10. #10
    Membre à l'essai
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Janvier 2016
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Architecte réseau

    Informations forums :
    Inscription : Janvier 2016
    Messages : 36
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Et si vous débutez, quelle bonne raison avez vous de ne pas utiliser une version récente (on est bientôt en 3.7!)?
    heu... suivre un tuto élaboré en Python 2.7 par exemple...
    Ok, ça date de 2014, mais si tu peux me proposer l'équivalent en français, pas de problème, je suis preneur...

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par scarou Voir le message
    Ok, ça date de 2014, mais si tu peux me proposer l'équivalent en français, pas de problème, je suis preneur...
    Vous avez le Swinnen et les autres cours et tutos disponibles de la rubrique.
    C'est pas une video sur Youtube: apprendre c'est pratiquer, se battre à essayer de se faire comprendre par la machine...

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

  12. #12
    Membre à l'essai
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Janvier 2016
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Architecte réseau

    Informations forums :
    Inscription : Janvier 2016
    Messages : 36
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Vous avez le Swinnen et les autres cours et tutos disponibles de la rubrique.
    C'est pas une video sur Youtube: apprendre c'est pratiquer, se battre à essayer de se faire comprendre par la machine...

    - W
    Visiblement on a un problème de communication. Tu me demandais pourquoi je travail en Python 2.7 Je te donne donc le lien du tuto qui en est la raison car il traite de l’interfaçage Arduino /Python dont j'ai besoin, et à la question "tu peux me proposer un équivalent en français ?", tu me balance l'intégrale de Gérard Swinnen ???
    Je ne doute pas qu'il s'agisse là d'un ouvrage fort intéressant mais... en quoi cela répond à la question ? Il ne traite ni de l'interfaçage avec l'Arduino ni de l'écoute d'un port série ni même de matplotlib...

    Je pense que je me suis tout simplement trompé de forum, veuillez excuser cette brève incursion.

  13. #13
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par scarou Voir le message
    Il ne traite ni de l'interfaçage avec l'Arduino ni de l'écoute d'un port série ni même de matplotlib...
    Pour l'instant vous demandez de l'aide pour essayer de comprendre un problème que vous avez avec tkinter (et peut être matplotlib).

    A priori, c'est le bon forum. Pour autant que vous compreniez qu'un problème, c'est d'abord construire un exemple minimal qui permette de le reproduire.

    Après si vous pensez qu'échanger des données avec un port série avec un Arduino change fondamentalement ce qu'on doit savoir pour programmer.... désolé, je ne vois pas.

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

  14. #14
    Membre à l'essai
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Janvier 2016
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Architecte réseau

    Informations forums :
    Inscription : Janvier 2016
    Messages : 36
    Points : 19
    Points
    19
    Par défaut
    Oui, on est bien d'accord...

    La question était : Pourquoi est ce que lorsque je tentais de positionner des éléments avec la méthode .grid plus rien ne s'affichait alors qu’auparavant cela fonctionnait avec la méthode .pack

    La réponse est : Nom : Screenshot-2018-3-28 Apprendre à programmer avec Python.png
Affichages : 450
Taille : 4,2 Ko


    Maintenant ça marche.
    Pièce jointe 365465

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

Discussions similaires

  1. Positionnement par GRID()
    Par santaflam dans le forum Tkinter
    Réponses: 6
    Dernier message: 08/10/2007, 19h54
  2. activation macro par défaut , impossible?
    Par scofild20 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 29/03/2007, 16h41
  3. débutant : envoi d'un String par socket impossible
    Par 2tsiris dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 26/02/2007, 18h17
  4. Filtrage par Formulaire impossible
    Par Smint dans le forum Access
    Réponses: 10
    Dernier message: 09/09/2006, 11h17
  5. [TSynMemo] Positionnement par ligne et colonne
    Par Mercilius dans le forum Composants VCL
    Réponses: 9
    Dernier message: 16/04/2003, 16h22

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