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 :

variable non définie et affichage des dimensions d'une fenêtre en direct


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2021
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2021
    Messages : 15
    Par défaut variable non définie et affichage des dimensions d'une fenêtre en direct
    Alors voilà mon problème:
    J'aimerais que le label sur ma 'StartPage' affiche les dimensions en direct de la fenêtre (l x h + x + y) donc pour ça je sais qu'il faut utiliser .geometry() mais le problème que j'ai c'est que app (ma fenêtre) n'est définie que plus tard et je ne n'arrive pas à la définir avant sans que tout plante.
    De plus si jamais qqn me trouve une solution a ce problème je ne suis pas sur que ça fonctionne correctement quand même, qu'il n'y ai pas un ou plusieurs problèmes en plus dans mon code… (Comme par exemple d'afficher la taille une seule fois et non pas en direct)
    Merci d'avance,
    Voici mon code:

    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
    from tkinter import *
    
    class windows(Tk):
    
        def __init__(self, *args, **kwargs):
            Tk.__init__(self, *args, **kwargs)
            container = Frame(self)
    
            container.pack(side="top", fill="both", expand=True)
    
            container.grid_rowconfigure(0, weight=1)
            container.grid_columnconfigure(0, weight=1)
    
            self.frames = {}
    
            for F in (StartPage):
                frame = F(container, self)
    
                self.frames[F] = frame
    
                frame.grid(row=0, column=0, sticky="nsew")
    
            self.show_frame(StartPage)
    
        def show_frame(self, cont):
            frame = self.frames[cont]
            frame.tkraise()
    
    
    class StartPage(Frame):
    
        def __init__(self, parent, controller):
            Frame.__init__(self, parent, bg='black')
            center = Frame(self, bg='black')
            center.pack(expand=YES)
    
            appsize = app.geometry()
            titre = Label(center, text=str(appsize), font=(40), bg='#000000', fg='#FFFFFF')
            titre.grid(row=0, column=1)
    
    
    app = windows()
    app.title("Don't press the button")
    fullscreenstate = True
    app.attributes('-fullscreen', fullscreenstate)
    app.config(bg='black')
    width_screen = app.winfo_screenwidth()
    height_screen = app.winfo_screenheight()
    app.minsize(width_screen//3, height_screen//3)
    
    app.mainloop()

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

    Techniquement, avec Python, une variable ne sera définie que lorsqu'on lui aura assigné un objet.

    Donc si on écrit app = windows() et que dans ce qui se déroule derrière l'appel à windows on a besoin de la variable app qui n'existe pas encore, ben, çà plante et il n'y a pas de solution: il faut ré-écrire le code pour éviter cela.

    Et c'est d'abord un problème de conception i.e. définir qui fait quoi et qui est quoi. Par exemple pourquoi avoir fait de window une sous classe de Tk plutôt que de Frame (ce qui permettrait d'avoir un "root" global et existant avant), passer l'objet fenêtre principale à la fonction qui en a besoin (sans passer par les variables globales donc) est une autre solution, vous pouvez aussi regarder dans la documentation tk comment récupérer l'objet "fenêtre principale",...

    Plein de solutions à vous d'arbitrer celle qui conviendra le mieux à vos besoins (où d'en inventer d'autres).

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

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2021
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2021
    Messages : 15
    Par défaut
    Je commence à peine la programmation, et donc pour ce qui est de windows qui est une sous classe de Tk j'avais juste pris un code sur un forum sans trop trop comprendre comment cela marchait... Et donc la en mettant Tk en sous classe de Frame et en creant un root global avant, je n'ai pas de message d'erreur et root se lance sans problème mais la classe windows ne marche plus ( La frame StartPage ne s'affiche donc pas) et je ne sais pas comment faire pour régler ça...
    (Par contre effectivement créer un root global avant me semble être une bonne solution qui de plus me facilitera bcp les choses pour la suite)

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

    Citation Envoyé par Thewhyap Voir le message
    Je commence à peine la programmation, et donc pour ce qui est de windows qui est une sous classe de Tk j'avais juste pris un code sur un forum sans trop trop comprendre comment cela marchait...
    C'est une bonne idée de regarder/récupérer des codes sur Internet mais si vous voulez les modifier, il faut comprendre comment çà marche et avoir un niveau proche de celui qui l'a écrit.

    N'oubliez pas non plus que lorsque vous postez dans un forum, on va jauger comment répondre à vos questions en fonction du code que vous avez écrit.

    Donc si vous partez à écrire des class sans rien piger à la POO et en ignorant ce que sont les variables globales, la seule aide qu'on pourra vous donner est de vous recommander d'ouvrir un tuto.

    note: ici vous avez de la chance, je connais le code que vous avez recopié et il est franchement pourri... mais vous ne le savez pas encore.

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

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2021
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2021
    Messages : 15
    Par défaut
    Euh d'accord mais bon j'aurais au moins aimé qu'on me dise en quoi ce code est pourri ou au moins une petite explication... Car bon pour regarder des tutos merci du conseil c'est ce que je fais et que je vais continuer a faire mais en apprenant j'aime bien bosser sur un projet en parallèle ça m'aide à apprendre beaucoup plus vite car au moins je rencontre des problèmes que je cherche à régler et quand je suis vraiment bloqué je viens demander un peu d'aide pour pouvoir continuer mon projet par la suite... Pour ca que je suis venu ici,
    mais bon pas grave merci quand même.

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

    Citation Envoyé par Thewhyap Voir le message
    Euh d'accord mais bon j'aurais au moins aimé qu'on me dise en quoi ce code est pourri ou au moins une petite explication...
    Parce c'est juste un exemple de POO avec tkinter qui n'essaie pas de répondre a un besoin autre que passer d'une page à l'autre.

    Et rien qu'en disant çà, on s'attend à trouver une class Page et un contrôleur qui gère l'affichage des pages successives avec une interface qui permet d'utiliser la mécanique sans avoir à ouvrir le capot.

    Ce qui fait que beaucoup de débutants recopient ce code comme point de départ et, au lieu de comprendre la mécanique, pataugent en essayant de l'adapter.

    Techniquement on n'a pas besoin de classes pour faire la même chose:
    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
    from tkinter import *
     
     
    def do_shownext(frames, i):
        i = (i + 1) % len(frames)
        frames[i].tkraise()
     
    root = Tk()
     
    frames = []
    for i, color in enumerate(('red', 'green', 'yellow', 'grey')):
        f = Frame(root, width=200, height=200, bg=color)
        f.pack_propagate(0)
        Label(f, text=f'Frame {i}').pack()
        Button(f, text='next', command=lambda i=i: do_shownext(frames, i)).pack()
        f.grid(row=0, column=0, sticky='news')
        frames.append(f)
     
    frames[0].tkraise()
    root.mainloop()
    Ca illustre le fonctionnement de certaines primitives tkinter et vous savez que vous ne pourrez pas en faire grand chose à part essayer de comprendre comment çà fonctionne.

    Et si d'aventure on devait coder un truc dans le genre, on saurait pourquoi on doit le faire plutôt qu'utiliser Panedwindow ou Notebook.

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

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2021
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2021
    Messages : 15
    Par défaut
    Merci beaucoup, visiblement je fais parti de ces débutants mais bon c'est des erreurs qu'on apprends le mieux!

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 21/02/2012, 16h41
  2. GUI Affichage des axes dans une fenêtre de type 'axes'
    Par Matersss dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 09/03/2011, 12h52
  3. Affichage des résultats dans une fenêtre
    Par yoyo69 dans le forum MATLAB
    Réponses: 2
    Dernier message: 10/12/2007, 09h06
  4. Réponses: 12
    Dernier message: 10/05/2006, 14h02
  5. Problème de variable non définie
    Par Mimi Bulles dans le forum Langage
    Réponses: 2
    Dernier message: 07/05/2006, 09h03

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