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 :

fonctions Copier Coller


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2010
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2010
    Messages : 83
    Par défaut fonctions Copier Coller
    Bonjour.
    J'aimerais faire des fonctions Couper, Copier et Coller pour mon programme.
    J'ai vu que Calculext le fait, et après avoir simplifier au maximum le code, ça marche uniquement dans une classe, et pas dans un programme sans classes.
    Et, dans mon programme, je n'ai pas créé de classes, donc j'aurais besoin de votre aide (et en particulier celle de Tyrtamos) pour m'expliquer ce qui ne marche pas.

    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
    def couper(self):
            self.clipboard_clear()
            a=self.focus_get().index(Tkinter.ANCHOR)
            i=self.focus_get().index(Tkinter.INSERT)
            if i<a:
                    a,i=i,a
            t=self.focus_get().get()
            s=t[a:i]
            t=t[0:a] + t[i:]
            self.focus_get().delete(0,Tkinter.END)
            self.focus_get().insert(0,t)
            self.focus_get().icursor(a)
            self.clipboard_append(s)
     
    def copier(self):
            self.clipboard_clear()
            self.clipboard_append(self.selection_get())
     
    def coller(self):
            t=self.selection_get(selection='CLIPBOARD')
            self.focus_get().insert(Tkinter.INSERT,t)
    Code sans classes (qui ne marche pas) :
    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
    def couper():
        clipboard_clear()
        a=focus_get().index(ANCHOR)
        i=focus_get().index(INSERT)
        if i<a:
            a,i=i,a
        t=focus_get().get()
        s=t[a:i]
        t=t[0:a] + t[i:]
        focus_get().delete(0,END)
        focus_get().insert(0, t)
        focus_get().icursor(a)
        clipboard_append(s)
     
    def copier():
        clipboard_clear()
        clipboard_append(selection_get())
     
    def coller():
        t=selection_get(selection='CLIPBOARD')
        focus_get().insert(INSERT,t)
    Quelqu'un sait pourquoi ça ne fonctionne pas ?

    Merci pour votre aide.

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    C'est normal: ce ne sont pas des fonctions, mais des méthodes appartenant aux widgets.

    Lorsque dans la classe "class Calculext(Tkinter.Frame):" on appelle "self.clipboard_clear()", on appelle la méthode clipboard_clear() appartenant à l'instance de la classe Calculext, elle-même héritée de Tkinter.Frame. Et comme la classe Calculext n'a pas redéfini la méthode clipboard_clear(), c'est celle de la classe parente qui est appelée.

    Cela fait partie des raisons pour lesquelles je ne programme les fenêtres graphiques qu'avec des classes. Une fois qu'on a bien compris, ça devient très clair.

    Pour faire fonctionner sans classe, essaie d'utiliser la variable instance du widget concerné ou de l'un de ses parents comme préfixe.

    Tyrtamos

  3. #3
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2010
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2010
    Messages : 83
    Par défaut
    Merci, j'ai réussi.

    Si quelqu'un à besoin du 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
    def couper():
        fenetre.clipboard_clear()
        a=fenetre.focus_get().index(ANCHOR)
        i=fenetre.focus_get().index(INSERT)
        if i<a:a,i=i,a
        t=fenetre.focus_get().get()
        s=t[a:i]
        t=t[0:a] + t[i:]
        fenetre.focus_get().delete(0,END)
        fenetre.focus_get().insert(0, t)
        fenetre.focus_get().icursor(a)
        fenetre.clipboard_append(s)
     
    def copier():
        fenetre.clipboard_clear()
        fenetre.clipboard_append(fenetre.selection_get())
     
    def coller():
        t=fenetre.selection_get(selection='CLIPBOARD')
        fenetre.focus_get().insert(INSERT,t)
    Au revoir.

  4. #4
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2010
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2010
    Messages : 83
    Par défaut
    Bonjour.
    J'ai bien amélioré les fonctions :

    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
     
        def selectAll(self,event=""):
            """Recherche le widget qui a le focus et séléctionne tout son contenu"""
            try:self.focus_get().selection_range(0,'end')    # Pour les Entry
            except:self.focus_get().tag_add('sel',"0.0",'end')    # Pour les Text
     
        def couper(self):
            """Coupe la selection et la conserve dans le presse papier"""
     
            try:a=self.focus_get().index('anchor')
            except:pass
            i=self.focus_get().index('insert')
     
            if i<a:a,i=i,a  # Si la selection à été faite à l'envers (de droite à gauche, on le remet dans le bon sens
     
            self.clipboard_clear() # On efface le contenu du presse papier
            self.clipboard_append(self.selection_get())   # On copie la selection dans le presse papier
            self.focus_get().delete(a,i)   # On efface la selection
     
        def copier(self):
            """Copie la selection dans le presse papier"""
            self.clipboard_clear()     # On efface le contenu du presse papier
            self.clipboard_append(self.selection_get())   # On copie la selection dans le presse papier
     
        def coller (self):
            """Colle le contenu du presse papier en effaçant la selection, si il y en a une"""
            try:
                a,i=self.focus_get().index('anchor'),self.focus_get().index('insert')     # Récupération de la selection (si il y en a une)
                if i<a:a,i=i,a  # Si la selection à été faite à l'envers (de droite à gauche, on le remet dans le bon sens
     
                self.focus_get().delete(a,i)   # Si il y a une selection, on l'efface
                self.focus_get().insert('insert',self.selection_get(selection='CLIPBOARD'))     # On insert le contenu du presse papier au niveau du curseur
            except:
                self.focus_get().insert(self.focus_get().index('insert'),self.selection_get(selection='CLIPBOARD'))
    Comme vous pouvez le constater, mon programme a lui aussi des classes, désormais.

    Mes modifications ont amélioré le comportement des fonctions pour les rendre plus classiques (effacement de la sélection lors d'un Coller, suppression de la sélection, et non pas du contenu de tout le widget lors d'un couper, code simplifié, etc...).
    Et je suis en train de mettre en place la compatibilité des fonctions avec les widgets Text.
    Mais je ne parviens pas à effacer la sélection dans les Text pour les fonctions Couper et Coller, car self.focus_get().index('anchor') ne fonctionne pas (TclError: bad text index "anchor").
    Comment récupérer le point d'ancrage de la sélection pour un Text ?

    Merci pour votre précieuse aide.

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

Discussions similaires

  1. Comment remplacer la fonction Copier/Coller
    Par P96O1004 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 24/03/2009, 12h39
  2. Fonction copier, coller, couper
    Par PhoeniX1405 dans le forum VB 6 et antérieur
    Réponses: 17
    Dernier message: 23/09/2008, 15h24
  3. fonction copier coller
    Par kroma23 dans le forum Delphi
    Réponses: 1
    Dernier message: 29/05/2007, 02h12
  4. Fonction copier/coller avec un menu
    Par avogadro dans le forum Langage
    Réponses: 3
    Dernier message: 16/03/2006, 22h44
  5. [debutant]class TCustomEdit et les fonctions Copier/Coller
    Par Revan777 dans le forum C++Builder
    Réponses: 6
    Dernier message: 05/01/2006, 19h29

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