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 :

Insertion texte dans un onglet


Sujet :

Python

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Points : 273
    Points
    273
    Par défaut Insertion texte dans un onglet
    Bonjour,

    j'ai fait ce code pour bénéficier de la fonction Autohide d'une scrollbar mais il me prive de la fonction pack() lors de la création des onglets.
    Ce qui fait que j'arrive plus à ouvrir un fichier texte dans un des onglets.
    Sauriez-vous comment faire, svp.


    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    from tkinter import *
    from PIL import Image, ImageTk
    from tkinter import filedialog, ttk
    from tkinter.filedialog import askopenfile
     
    class MyTab(Frame):
     
        def __init__(self, root, name):
            Frame.__init__(self, root)
     
            self.root = root
            self.name = name
     
    class AutoScrollbar(Scrollbar):
        # a scrollbar that hides itself if it's not needed.  only
        # works if you use the grid geometry manager.
        def set(self, lo, hi):
            if float(lo) <= 0.0 and float(hi) >= 1.0:
                self.grid_remove()
            else:
                self.grid()
            Scrollbar.set(self, lo, hi)
        def pack(self, **kw):
            raise TclError ("cannot use pack with this widget")
        def place(self, **kw):
            raise TclError ("cannot use place with this widget")
     
    def openFile():
        global filename
        file = askopenfile(parent=root,title='Select a File')
        filename = file.name
        t = file.read()
     
        print(tab_names[0])
     
        tab_names[1].delete(0.0, END)
        tab_names[1].insert(0.0, t)
        file.close()    
     
    def create_frame(master):
        frame = Frame(master, bd=2, relief=SUNKEN)
        yscrollbar = AutoScrollbar(frame)
        yscrollbar.grid(row=0, column=1, sticky=N+S)
        text = Text(frame, 
                    yscrollcommand=yscrollbar.set)
     
        text.grid(row=0, column=0, sticky='nwse') # expansion du widget Text
     
        frame.grid_columnconfigure(0, weight=1) # expansion de la colonne
        frame.grid_rowconfigure(0, weight=1) # expansion de la colonne
     
        return frame
     
    if __name__ == '__main__':
        root = Tk()
     
        root.title("MonkeyCode Editor")
     
        menubar = Menu(root)
        filemenu = Menu(menubar)
        filemenu.add_command(label="Open", command=openFile)
        menubar.add_cascade(label="File", menu=filemenu)
     
        root.config(menu=menubar)   
     
        nb = ttk.Notebook(root)
     
        root.update()
     
        #for i in range(0, len(tab_names)):
     
        frame1 = create_frame(nb)
        nb.add(frame1, text="Text1")
     
        frame2 = create_frame(nb)
        nb.add(frame2, text="Text2")
     
        frame3 = create_frame(nb)
        nb.add(frame3, text="Text3")
     
        frame4 = create_frame(nb)
        nb.add(frame4, text="Text4") 
     
        nb.pack(expand=YES, fill=BOTH)
     
        mainloop()

    Je vous remercie d'avance.

    Arsène

  2. #2
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Sans lire le code, je ne comprends pas bien votre question... Quel est le rapport entre pack (méthode pour placer géométriquement un widget) et l'ouverture d'un fichier après click utilisateur ? Pour moi c'est totalement indépendant l'un de l'autre.

    Sur un cas simple, pouvez-vous démontrer cette dépendance ?
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Points : 273
    Points
    273
    Par défaut
    Avec ce code, j'ouvre un fichier .txt et je l'insère dans un onglet.


    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
    from tkinter import *
    from tkinter import filedialog, ttk
    from tkinter.filedialog import askopenfile
     
    import os
     
    filename = None
     
    def openFile():
        global filename
        file = askopenfile(parent=root,title='Select a File')
        filename = file.name
        t = file.read()
        tbox2.delete(0.0, END)
        tbox2.insert(0.0, t)
        file.close()
     
    root = Tk()
     
    root.title("MonkeyCode Editor")
     
    menubar = Menu(root)
    filemenu = Menu(menubar)
    filemenu.add_command(label="Open", command=openFile)
     
    menubar.add_cascade(label="File", menu=filemenu)
     
    root.config(menu=menubar)
     
    # Defines and places the notebook widget
     
    nb = ttk.Notebook(root)
     
    # Adds tab 1 of the notebook
    page1 = ttk.Frame(nb)
    nb.add(page1, text='Texte')
     
    # Add the textbox
    tbox2 = Text(page1, wrap=WORD)
    tbox2.pack(fill=BOTH, expand=1)
     
    # Adds tab 2 of the notebook
    page2 = ttk.Frame(nb)
    nb.add(page2, text='Tab2')
     
    # Add the textbox
    tbox3 = Text(page2, wrap=WORD)
    tbox3.pack(fill=BOTH, expand=1)        
     
    ttk.Style().configure(root, background="green")
    nb.pack(fill=BOTH, expand=1)
     
    root.geometry("850x650+100+100")
    root.configure(background="green")
     
    root.mainloop()

    dans ma fonction openFile, je mets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        t = file.read()
        tbox2.insert(0.0, t)
    dans le code précédent je remplace tbox2 par tab_names[1], et ça ne marche pas.
    J'en déduis que c'est parce que j'ai pas utilisé la fonction pack()

  4. #4
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Il nous faudrait plus d'informations concernant tab_names (initialisation, ajout des éléments, et quels éléments) car si tab_names[1] est bien du type Entry, alors ça doit fonctionner je suppose. Seulement il faudrait vérifier avec un type(tab_names[1]).
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Points : 273
    Points
    273
    Par défaut
    Y'a un print(tab_names[0]) dans le premier code.
    si on l'exécute, quand on ouvre un fichier la console répond :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        print(tab_names[0])
    NameError: name 'tab_names' is not defined
    Je voudrai justement savoir qu'est-ce que je dois mettre à la place de tab_names pour pouvoir placer le texte dans l'onglet.

  6. #6
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Donc quel est le rapport avec pack du coup, car il est évident que l'erreur annonce que tab_names n'est pas trouvé, qu'il faut créer ou pas cette variable, c'est de vous que dépend cette décision. Comprenez vous le code que vous présentez ?
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Points : 273
    Points
    273
    Par défaut
    Mon problème c'est que je sais pas le créer le tab_names.
    J'aurai pas du parler de pack() ou de tab_names. Ce que je veux, c'est simplement récupérer le nom du premier onglet (ou du suivant) pour pouvoir y insérer le texte. Savez-vous faire cela?

  8. #8
    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,

    Citation Envoyé par Arsene12 Voir le message
    Mon problème c'est que je sais pas le créer le tab_names.
    J'aurai pas du parler de pack() ou de tab_names. Ce que je veux, c'est simplement récupérer le nom du premier onglet (ou du suivant) pour pouvoir y insérer le texte.
    Certes mais ce qui est important est ce que vous écrivez pour y arriver. Visiblement, vous récupérez du code (ce qui n'est pas mauvais) mais vous n'avez pas pris le temps d'apprendre pour le comprendre et savoir l'adapter à vos besoins.

    Citation Envoyé par Arsene12 Voir le message
    Savez-vous faire cela?
    Récupérer le nom du premier onglet? Çà ne vous servirait à pas grand chose puisqu'il faudra insérer le texte dans un widget Text (qui est autre chose).
    Commencez par bien poser le problème à résoudre! Et si vous n'y a arrivez pas inutile qu'on ajoute des choses à votre code. Çà va juste le compliquer. Il vous sera encore plus difficile de le comprendre et le faire évoluer.

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

  9. #9
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Grilled by wiztricks
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Points : 273
    Points
    273
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Récupérer le nom du premier onglet? Çà ne vous servirait à pas grand chose puisqu'il faudra insérer le texte dans un widget Text (qui est autre chose).
    - W
    Je comprends pas. J'ai plusieurs onglets et il me faut bien désigner celui qui doit accueillir le texte.

    C'est dans le widget Text associé à l'onglet que doit s'insérer le texte.


    si j'écris ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        text = Text(root)
        text.insert(0.0, t)
        text.pack()
    le texte s'insère en dessous de la zone de texte l'onglet. Je veux qu'il s'insère dedans.

  11. #11
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Mais cet onglet est représenté par quelle variable dans votre code ?
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  12. #12
    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 Arsene12 Voir le message
    J'ai plusieurs onglets et il me faut bien désigner celui qui doit accueillir le texte.
    Au bout du bout, il faudra insérer le contenu du fichier dans un widget Text.
    Et vous avez décidé de placer ce widget Text est dans une Frame associée à l'onglet tartemolle d'une instance de Notebook...
    Et le soucis est d'arriver à récupérer le bon widget Text pour que fonction "openfile" sache dans quoi insérer le contenu du fichier désigné par l'utilisateur...

    Citation Envoyé par Arsene12 Voir le message
    Je comprends pas.
    Vous débutez, normal que vous ne compreniez pas. Surtout si vous négligez de passer du temps à passer à apprendre les bases pour vous lancer dans un projet qui est, visiblement, encore un peu trop compliqué.
    Tenez, vous avez dans les bibliothèques standards un editeur de texte dans idlelib.
    Allez voir ce que contiennent les différents modules. Lire le code écrit par d'autres est ce qu'on peut faire pour s'améliorer et voir comment d'autres ont résolus leurs problèmes. Si vous n'arrivez pas à lire/comprendre ce code là, comment espérez vous arriver à écrire le votre?


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

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Points : 273
    Points
    273
    Par défaut
    J'essaye de reproduire l'interface du notepad. J'y serai arrivé une fois que j'aurai résolu ce problème.
    Dans le notepad++, la scrollbar disparaît entièrement lorsque le texte est trop court (elle ne reste pas en grisé).

    Ce que je cherche à comprendre, c'est comment récupérer le bon widget Text, vous l'avez dit.

    Comme c'est en faisant des essais qu'on arrive parfois à trouvé la solution, j'ai mis des print dans 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
        frame1 = create_frame(nb)
        nb.add(frame1, text="Text1")
        tbox1= Text(frame1, wrap=WORD)    
        print(tbox1)
     
        frame2 = create_frame(nb)
        nb.add(frame2, text="Text2")
        tbox2 = Text(frame2, wrap=WORD)
        print(tbox2)
     
        frame3 = create_frame(nb)
        nb.add(frame3, text="Text3")
        tbox3 = Text(frame3, wrap=WORD)
        print(tbox3)
    J'obtiens comme résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    .!notebook.!frame.!text2
    .!notebook.!frame2.!text2
    .!notebook.!frame3.!text2
    Rien que là, j'ai du mal à comprendre. Pourquoi text2 et non pas text tout court?

  14. #14
    Membre actif
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Points : 273
    Points
    273
    Par défaut
    Ça y'est, j'ai compris le problème. C'est en pensant au notepad++ que j'ai trouvé la solution.
    En fait le signet doit être créé au moment de l'ouverture du fichier et non pas avant.


    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
     
    from tkinter import *
    from PIL import Image, ImageTk
    from tkinter import filedialog, ttk
    from tkinter.filedialog import askopenfile
     
     
    class AutoScrollbar(Scrollbar):
        # a scrollbar that hides itself if it's not needed.  only
        # works if you use the grid geometry manager.
        def set(self, lo, hi):
            if float(lo) <= 0.0 and float(hi) >= 1.0:
                self.grid_remove()
            else:
                self.grid()
            Scrollbar.set(self, lo, hi)
        def pack(self, **kw):
            raise TclError ("cannot use pack with this widget")
        def place(self, **kw):
            raise TclError ("cannot use place with this widget")
     
    def openFile():
        global filename
        file = askopenfile(parent=root,title='Select a File')
        filename = file.name
        t = file.read()
     
        #print(tbox6)
     
        frame1 = create_frame(nb, t)
        nb.add(frame1, text="Texte1")
        tbox1 = Text(frame1, wrap=WORD)    
        print(tbox1)
     
        print(nb.select(nb.index("current")))
     
        file.close()    
     
    def create_frame(master, t):
        frame = Frame(master, bd=2, relief=SUNKEN)
        yscrollbar = AutoScrollbar(frame)
        yscrollbar.grid(row=0, column=1, sticky=N+S)
        text = Text(frame, 
                    yscrollcommand=yscrollbar.set, background="beige")
     
        text.grid(row=0, column=0, sticky='nwse') # expansion du widget Text
     
        frame.grid_columnconfigure(0, weight=1) # expansion de la colonne
        frame.grid_rowconfigure(0, weight=1) # expansion de la colonne
     
        text.insert(0.0, t)
     
        #print(text.grid)
     
        return frame
     
    if __name__ == '__main__':
        root = Tk()
     
        root.title("MonkeyCode Editor")
     
        menubar = Menu(root)
        filemenu = Menu(menubar)
        filemenu.add_command(label="Open", command=openFile)
        menubar.add_cascade(label="File", menu=filemenu)
     
        root.config(menu=menubar)   
     
        nb = ttk.Notebook(root)
     
        root.update()
     
        #frame1 = create_frame(nb)
        #nb.add(frame1, text="Text1")
        #tbox1 = Text(frame1, wrap=WORD)    
        #print(tbox1)
     
        t=""
     
        frame2 = create_frame(nb, t)
        nb.add(frame2, text="Text2")
        tbox2 = Text(frame2, wrap=WORD)
        print(tbox2)  
     
        nb.pack(expand=YES, fill=BOTH)
     
        mainloop()
    Pour que ça ressemble entièrement au notepad++, il faut que le focus soit sur le nouvel onglet et qu'une croix soit rajoutée sur les onglets pour pouvoir les fermer.

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

Discussions similaires

  1. Insertion texte dans Word au curseur
    Par fweds dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 01/10/2008, 21h37
  2. Insertion texte dans textarea modifiée !
    Par Aklarel dans le forum ASP.NET
    Réponses: 12
    Dernier message: 29/05/2008, 14h15
  3. [CKEditor] problème insertion texte dans base de données
    Par exeee dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 22/10/2007, 11h12
  4. Insertion texte dans textarea avec IE
    Par brazilia28 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 22/08/2007, 10h56
  5. [TP]Insertion texte dans un autre programme
    Par FLB dans le forum Turbo Pascal
    Réponses: 53
    Dernier message: 14/06/2003, 20h11

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