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 :

positionner/indenter dans widget Text


Sujet :

Tkinter Python

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 103
    Points : 55
    Points
    55
    Par défaut positionner/indenter dans widget Text
    Developp/euses/eurs bonjour,

    Dans un widget Text, je cherche à insérer le texte à une ligne donnée et à l' indenter.

    Pour cela j'utilise un index de type "ligne.colomne".

    Problème: Tkinter ignore cet index (il utilise tk.END à défault).
    Que je mette 3.0 ou 3.5, le texte se retrouve toujours en position tk.END (a la fin du texte )
    Pourquoi ?

    Python version : 2.5.1
    Tk version 8.4

    Merci pour tout renseignement !

    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
     
    ...
            self.txt1 = tk.Text ( self.letop, width='80', height='10',
                                  font = ( 'Arial', 10, 'normal' ) )
            self.txt1.grid ( row=1, column=2, rowspan = 4 )
     
    #        Voici l insert a realiser. Au lieu de 3.5 le texte s insere a tk.END
    #        c-a-d a la fin du texte present.
            self.txt1.insert ( 3.5 , "inserer a la 3eme ligne en position 5ieme charactere")
     
     
    #        un test avec la methode get.
    #        l indexe fonctionne bien, la position 2.0, 2.6 est correcte
            self.txt1.insert ( 1.0 , "prem ligne\ndeux ligne" )
            print self.txt1.get (2.0, 2.6)
    ...

  2. #2
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    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
    #!/usr/bin/env python
    # -*- coding: ISO8859-1 -*-
     
     
    from Tkinter import *
     
     
    class test(Tk):
     
        def __init__(self,parent):
            Tk.__init__(self,parent)
            self.parent = parent
            self.initialize()
     
        def initialize (self) :
            wt = self.winfo_screenwidth()
            ht = self.winfo_screenheight()
            w = 500
            h = 200
            self.geometry("%dx%d+%d+%d" % (w,h, (wt-w)/2, (ht-h)/2 ) )
            self.resizable(width=False, height=False)
            self.txt1 = Text ( self, width='80', height='10', font = ( 'Arial', 10, 'normal' ) )
            self.txt1.pack()
            self.txt1.insert ( '3.5' , "inserer a la 3eme ligne en position 5ieme charactere\n")
            self.txt1.insert ( '1.0' , "prem ligne\n" )
            self.txt1.insert ( '2.0' , "deux ligne\n" )
            self.txt1.mark_set('ici', '1.0')
            self.txt1.insert ( '2.5' , "inserer a la 2eme ligne en position 5ieme charactere\n")
            self.txt1.mark_unset('ici')
     
            print self.txt1.get ('2.0', '2.6')
            self.txt1.update()
     
    if __name__ == "__main__":
        app = test(None)
        app.mainloop()
    @+
    Merci d'utiliser le forum pour les questions techniques.

  3. #3
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Une autre manière de faire (tag_add à la place de mark_set):

    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
    #!/usr/bin/env python
    # -*- coding: ISO8859-1 -*-
     
     
    from Tkinter import *
    from os import linesep
    from time import sleep
     
     
    class test(Tk):
     
        def __init__(self,parent):
            Tk.__init__(self,parent)
            self.parent = parent
            self.initialize()
     
        def initialize (self) :
            self.geometry("%dx%d+%d+%d" % (500, 180, (self.winfo_screenwidth()-500)/2, (self.winfo_screenheight()-180)/2 ) )
            self.resizable(width=False, height=False)
            self.txt1 = Text ( self, width='80', height='10', font = ( 'Arial', 10, 'normal' ) )
            self.txt1.pack()
            self.txt1.insert ( '3.5' , "inserer a la 3eme ligne en position 5ieme charactere" + linesep)
            self.txt1.update()
            print 'Index : CURRENT END'
            print self.txt1.index(CURRENT), self.txt1.index(END)
            sleep(3)
     
            self.txt1.insert ( '1.0' , "prem ligne" + linesep )
            self.txt1.update()
            print self.txt1.index(CURRENT), self.txt1.index(END)
            sleep(3)
     
            self.txt1.insert ( '2.0' , "deux ligne" + linesep)
            self.txt1.update()
            print self.txt1.index(CURRENT), self.txt1.index(END)
            sleep(3)
     
            self.txt1.tag_add('ici', '1.0')
            self.txt1.insert ( '2.5' , "inserer à la 2eme ligne aprés le 5ieme charactère")
            self.txt1.tag_add('insertion', '2.5', '2.54')
            self.txt1.tag_config('insertion', background='grey90', foreground='blue')
            self.txt1.update()
            print self.txt1.index(CURRENT), self.txt1.index(END)
            sleep(3)
     
            # self.txt1.delete( '3.0', '4.0') # decommante pour voir que si 4 n'existe pas 'ou ?' se positionne en END
            self.txt1.insert ( '3.9' , "ou ?")
            self.txt1.tag_add('ou', '3.9', '3.13')
            self.txt1.tag_config('ou', background='grey90', foreground='blue')
            self.txt1.update()
            print self.txt1.index(CURRENT), self.txt1.index(END)
     
            print linesep + "Vérif ligne 2 : ", self.txt1.get ('2.0', '2.6')
     
    if __name__ == "__main__":
        app = test(None)
        app.mainloop()
    Petit edit pour rajouter une 'animation'
    Merci d'utiliser le forum pour les questions techniques.

  4. #4
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Citation Envoyé par santaflam Voir le message
    Pourquoi ?
    Oui, la réponse aussi...
    Car l'index 3.5 (ou même 3.0) n'existe pas lors de ton insert (regarde le premier print self.txt1.index(CURRENT), self.txt1.index(END))
    Merci d'utiliser le forum pour les questions techniques.

  5. #5
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 103
    Points : 55
    Points
    55
    Par défaut
    Salut Pausekawa,
    Merci pour tes réponses!!

    Ca me froisse un peu qu' il faille remplir de caract. les positions, avant de pouvoir les utiliser. J'ai joint en image ce que je veux réaliser (...).

    Suis obligé de remplir tout le champ texte de caractères blancs pour créer mon format. Sans compter que ca va poser problème lorsque ces caractères blancs fictifs vont se décaller en fin de ligne sur la ligne suivante...

    Ou n' y avait-il pas une méthode pour cacher (hide) un texte fictif que j' utiliserais pour remplir le champ ... ?

    Je cherche encore ...
    @+
    Images attachées Images attachées  

  6. #6
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonsoir,

    Je manque d'habitude avec text (je ne l'utilise jamais) mais une idée :

    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
    #!/usr/bin/env python
    # -*- coding: ISO8859-1 -*-
     
     
    from Tkinter import *
    from os import linesep, sep
     
     
    class test(Tk):
     
        def remplir(self):
            if self.client == 0:
                nom = 10 * ' ' + 'Dupond' + 40 * ' '  + 'Ville, date'
                adresse = 10 * ' ' + '1 rue du lievre'
                ville = 10 * ' ' + '2600 VILLE'
                pays = 10 * ' ' + 'FRANCE'
                self.client = 1
            elif self.client == 1:
                nom = 10 * ' ' + 'Halliday' + 40 * ' ' + 'Ville, date'
                adresse = 10 * ' ' + '1 rue de suisse'
                ville = 10 * ' ' + '0000 VILLE'
                pays = 10 * ' ' + 'SUISSE'
                self.client = 0
            self.txt1.delete( '2.0', '3.0')
            self.txt1.insert( '2.0' , nom + linesep)
            self.txt1.delete( '3.0', '4.0')
            self.txt1.insert( '3.0' , adresse + linesep)
            self.txt1.delete( '4.0', '5.0')
            self.txt1.insert( '4.0' , ville + linesep)
            self.txt1.delete( '5.0', '6.0')
            self.txt1.insert( '5.0' , pays + linesep)
     
        def __init__(self,parent):
            Tk.__init__(self,parent)
            self.parent = parent
            self.initialize()
     
        def initialize (self) :
            self.client = 0
            self.geometry("%dx%d+%d+%d" % (500, 210, (self.winfo_screenwidth()-500)/2, (self.winfo_screenheight()-210)/2 ) )
            self.resizable(width=False, height=False)
            self.txt1 = Text (self, width='80', height='10', font = ('Arial', 10, 'normal'), bg = 'yellow' )
            self.txt1.pack()
            indexligne = 0
            while indexligne < 7:
                self.txt1.insert(END, '' + linesep)
                indexligne += 1
            self.bannule = Button(self, text="Annuler", relief="raised", fg='dark slate blue', activebackground='white', activeforeground='#2a7aff', command = quit)
            self.bsuivant = Button(self, text="Remplir", relief="raised", fg='dark slate blue', activebackground='white', activeforeground='#2a7aff', command = self.remplir)
            self.bannule.pack(side=LEFT, padx=5, pady=5)
            self.bsuivant.pack(side=RIGHT, padx=5, pady=5)
     
    if __name__ == "__main__":
        app = test(None)
        app.mainloop()
    @+
    Merci d'utiliser le forum pour les questions techniques.

  7. #7
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 103
    Points : 55
    Points
    55
    Par défaut
    Ok merci PK!
    L' idee d'effacer est bonne. Je manque un peu de temps en ce moment mais je reviendrai sur le sujet, car j' aimerais tester les tags plus en détails...
    même si un test rapide montre que ca marche.

    @+

  8. #8
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonsoir,

    Citation Envoyé par santaflam Voir le message
    Je manque un peu de temps en ce moment mais je reviendrai sur le sujet, car j' aimerais tester les tags plus en détails...
    Et je me permet (a mon niveau) de t'encourager dans ce sens.
    C'est a mon avis une des choses primordiales, avec la parenté et lambda, a connaitre pour Tkinter.

    @+
    Merci d'utiliser le forum pour les questions techniques.

Discussions similaires

  1. position du curseur dans widget text
    Par aoumnad dans le forum Tkinter
    Réponses: 7
    Dernier message: 27/02/2013, 21h08
  2. Réponses: 0
    Dernier message: 22/07/2012, 15h40
  3. expressions régulières dans widget text
    Par Ruyneau dans le forum Tkinter
    Réponses: 5
    Dernier message: 16/02/2012, 08h32
  4. colorier une colonne dans un widget text
    Par Chris33 dans le forum Tkinter
    Réponses: 4
    Dernier message: 14/09/2006, 11h20
  5. Positionnement pointeur souris dans champ texte
    Par angelevil dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 12/03/2006, 12h58

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