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 :

Attribuer un titre à mon interface basée sur un widget frame


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
    Février 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 206
    Par défaut Attribuer un titre à mon interface basée sur un widget frame
    Bonjour à tous

    J'ai peur que le titre du topic ne soit pas très explicite :s

    J'écris un programme avec une classe qui se construit à partir d'un widget frame, plus des widgets viennent se placer dedans.Le début du code est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    from Tkinter import *
    import os
     
    class MyApp(Frame):
        def __init__(self):
            Frame.__init__(self,width=500,height=500)
    Je n'ai pas mis de nom à l'instance de Tkinter (comprendre pas de root=Tk() )c'est self qui la remplace. Mais comme ma classe "dérive" de Frame, self.title('Texte') n'est pas fonctionnel.

    Auriez-vous une idée? Merci d'avance

  2. #2
    Membre chevronné
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Par défaut
    Bonsoir,

    Ceci de convient il ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class MyApp( Frame ):
        def __init__(self, master):
            master.title( "MyApp" )
            Frame.__init__(self, master, width=500,height=500)
     
     
    root = Tk()
    MyApp( root )
    root.mainloop()
    Il est peu ordinaire de vouloir dériver une application d'un widget frame. Pourquoi ne dérives tu pas de Tk ? Souhaites tu utiliser ta frame dans plusieurs fenêtres d'une même application ?
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter les FAQ Python ou de visiter mon blog

  3. #3
    Membre chevronné
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Par défaut
    Je n'ai pas mis de nom à l'instance de Tkinter (comprendre pas de root=Tk() )c'est self qui la remplace.
    tkinter n'est pas une classe, mais un module il n'a donc pas d'instance

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    >>> import tkinter
    >>> tkinter
    <module 'tkinter' from 'C:\Python30\lib\tkinter\__init__.py'>
    Tk est la première fenêtre d'une application dans ton cas, self ne "remplace pas" les instances Tk, mais les instances de MyApp.

    Tu peux imaginer que self est une variable qui contient l'instance future de la classe dans laquel elle est définie

    La classe MyApp dérive de la classe Frame, MyApp bénéficie donc des attributs de frame qui contrairement à Tk n'a pas d'attribut title

    J'espère que je ne t'ai pas trop embrouillé, n'hésite pas si tu as des questions.
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter les FAQ Python ou de visiter mon blog

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 206
    Par défaut
    Salut Vincent et merci de tes réponses

    J'ai compris ce que tu as voulu expliquer, par contre pour ton exemple j'ai plus de mal. Mon code a cette structure:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class MyApp(Frame):
        def __init__(self,master):
            master.title('MyApp')
            Frame.__init__(self,master)
     
            Label(master,...).grid(...)
            Entry(master...).grid(...)
     
        def function(self,event):
            def Button(master,...).grid(...)
     
    root=Tk()
    MyApp(root)
    root.mainloop()
    En gros, j'ai une classe qui contient la fonction constructeur et d'autres, qui créent des instances de widget dans la meme fenetre. Je me mélange donc dans les "self". Si je ne met pas de self pour le nom du module de Tk(), ça ne marche pas et si j'en met ça ne marche pas non plus. Je comprend à peu près pourquoi ça ne marche pas dans les deux cas, mais je n'arrive pas à le faire marcher.

    Si tu n'arrives pas bien à visualiser mon code, je le posterai. Merci d'avance

  5. #5
    Membre chevronné
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Par défaut
    Je veux bien que tu postes ton code.

    Pour mon code, voici quelque explication :

    Dans une application Tk, toutes fenêtres et widgets sont hiérarchisés
    la fenêtre en haut de la hiérarchie est Tk. elle aura ensuite comme esclave des widgets ou d'autres fenêtres ( Toplevel )

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    root = Tk()
    frm = Frame( root, ... ) # esclave de root
    Label( frm, ) # esclave de frm
    Toplevel( root ) # autre esclave de root
    ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    def __init__(self,master):
            master.title('MyApp')
    je récupère le widget maître dans la variable master dans notre cas un objet Tk et je lui applique la méthode title.

    ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Frame.__init__(self,master)
    je passe l'objet Tk contenu dans master au constructeur de la classe parente.
    Comme tu peux le voir si dessous, le constructeur de frame demande
    un widget maitre mais qui n'est pas obligatoire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    >>> help( Frame.__init__ )
    Help on function __init__ in module tkinter:
     
    __init__(self, master=None, cnf={}, **kw)
        Construct a frame widget with the parent MASTER.
     
        Valid resource names: background, bd, bg, borderwidth, class,
        colormap, container, cursor, height, highlightbackground,
        highlightcolor, highlightthickness, relief, takefocus, visual, width.
     
    >>>
    J'aurai pus aussi accéder au master avec la méthode winfo_toplevel()
    Dans ce cas, pas besoin de récupérer le master
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class MyApp(Frame):
        def __init__( self ):
            Frame.__init__( self )
            master = self.winfo_toplevel()
            master.title("MyApp")
     
     
    MyApp( )
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter les FAQ Python ou de visiter mon blog

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 206
    Par défaut
    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    from Tkinter import *
    import os
     
    class MyApp():
        def __init__(self):
            Frame.__init__(self)
     
            Label(text='Code',fg='dark blue').grid(row=0,column=0,sticky=E)
            Label(text='Taille',fg='dark blue').grid(row=1,column=0,sticky=E)
            Label(text='Extension',fg='dark blue').grid(row=2,column=0,sticky=E)
     
            self.chaine,self.taille,self.extension=StringVar(),IntVar(),StringVar()
            self.chaine.set("default")
            self.taille.set(100)
            self.extension.set("png")
     
            self.entry1=Entry(textvariable=self.chaine)
            self.entry2=Entry(textvariable=self.taille)
            self.entry3=Entry(textvariable=self.extension)
     
            self.entry1.bind('<Return>',self.check_error)
            self.entry2.bind('<Return>',self.check_error)
            self.entry3.bind('<Return>',self.check_error)
     
            self.entry1.grid(row=0,column=1,padx=5,pady=5,sticky=W)
            self.entry2.grid(row=1,column=1,padx=5,pady=5,sticky=W)
            self.entry3.grid(row=2,column=1,padx=5,pady=5,sticky=W)
     
            self.width_max,self.height_max=200,200
     
        def check_error(self,event):
            try: self.taille.get()
            except: self.error_detected("taille")
            else:
                if(self.chaine.get() == ""): self.error_detected("chaine")
                if(self.extension.get() != "png"  \
                        and self.extension.get() != "jpg"
                        and self.extension.get() != "jpeg"
                        and self.extension.get() != "bmp"
                        and self.extension.get() != "gif"):
                    self.error_detected("extension")
                else:
                    self.getImage(self.chaine.get(),self.taille.get(),self.extension.get())
     
        def error_detected(self,location):
            if(location == "taille"):
                self.taille.set(100)
            elif(location == "chaine"):
                self.chaine.set("default")
            elif(location == "extension"):
                self.extension.set("png")
            else:
                return 0
     
        def getImage(self, value, height = 100, extension = "png"):
            import Image, ImageFont, ImageDraw, ImageTk
            from string import lower, upper
     
    	#petit saut en avant, je zappe quelques dizaines de lignes ou fonctions inutiles
     
    	photo=ImageTk.PhotoImage(self.im)
    		self.can=Canvas(width=self.width_max,height=self.height_max,bg='grey')
    		self.can.grid(row=3,column=0,columnspan=2,padx=5,pady=5)
    		self.label=Label(image=photo)
    		self.label.image=photo
    		self.label.grid(row=3,column=0,columnspan=2,padx=5,pady=5)
     
    	Button(text='Save',command=self.save).grid(row=4,column=0)
    	Button(text='Settings',command=self.settings).grid(row=4,column=1)
    	Button(text='Export',command=self.export).grid(row=5,column=0)
     
            #autres fonctions,meme syntaxe
     
    if __name__=='__main__':
        MyApp().mainloop()
    Voila mon code de base.Je pense que pour faire les choses bien, il faut que je lance TK(), puis que j'initialise un frame et que j'implémente mes widgets dedans. Ca fait un peu de boulot mais le résultat sera sûrement plus propre^^

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/03/2011, 13h46
  2. Comment créer une interface excel sur la base d'un tableau.?
    Par anasleco dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 30/09/2009, 18h03
  3. interface graphique sur mon serveur
    Par sara21 dans le forum Administration système
    Réponses: 1
    Dernier message: 27/10/2008, 22h31
  4. importer une base sur mon disque dur
    Par Ralfman68 dans le forum SQL Procédural
    Réponses: 0
    Dernier message: 29/10/2007, 12h04
  5. Classe VS.Net 2005 basée sur interface VS.Net 2003 ?
    Par dotnet dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 19/02/2007, 10h37

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