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 :

Control-o dans un widget text


Sujet :

Tkinter Python

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 147
    Points : 64
    Points
    64
    Par défaut Control-o dans un widget text
    Bonjour,
    J'ai un widget de type text auquel j'associe un text.bind('<Control-o>',commande truc)

    Si je modifie par - text.bind('<Control-O>',commande truc) - avec un O majuscule, la commande truc fonctionne bien par contre si je reviens à
    - text.bind('<Control-o>',commande truc) - alors la commande truc fonctionne mais il se rajoute automatiquement une ligne à mon texte dans le widget text.

    Je pense que c'est dû aux commandes prédéfinies des widget text (comme ctrl+c,...). Y-a-t-il un moyen de désactiver la commande ctrl+o prédéfinie?

    Merci pour vos réponses.
    Gabriel

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 347
    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 347
    Points : 36 870
    Points
    36 870
    Par défaut
    Salut,

    A priori, pour se débarrasser des bindings par défaut, il "suffit" de les redéfinir.
    Pour votre cas, je ne puis que vous offrir un exemple de code qui marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import tkinter as tk
    from tkinter.constants import *
     
    class Text(tk.Text):
        def __init__(self, parent=None, **opts):
            super().__init__(parent, **opts)
            self.bind('<Control-o>', self.dummy)
     
        def dummy(self, event):
            print ('ctrl-o')
     
    t = Text(height=20, width=50)
    t.pack(fill=BOTH)
    tk.mainloop()
    - W

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 147
    Points : 64
    Points
    64
    Par défaut
    bonjour,

    voici le code qui me pose problème.
    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
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    import tkinter
    import tkinter.filedialog as tkFileDialog
    import tkinter.ttk as ttk
    import sys
     
    class Fichier_menu():
        """ Gestion des actions du menu déroulant de fichier"""
     
        def __init__(self, parent, onglet, fenetre):
            """ Installation des sous-menus - Parent est la barre de menu principale et fenetre, la fenêtre associée"""
            self.mp = parent
            self.fe = fenetre
            self.ong = onglet
            self.menu_fichier = tkinter.Menu(self.mp, tearoff=0)
            self.mp.add_cascade(menu=self.menu_fichier,
                                label = "Fichier", underline =0)
            self.menu_fichier.add_command(label="Nouveau",accelerator="Ctrl+N",
                                          underline=0, font=('Comic Sans MS', 10),
                                          command=self.nouvelle_feuille)
            self.menu_fichier.add_command(label="Ouvrir", accelerator="Ctrl+O",
                                          underline=0, font=('Comic Sans MS', 10),
                                          command=self.ouverture_fichier)
            self.menu_fichier.add_command(label="Quitter", accelerator="Ctrl+Q",
                                          underline=0, command=self.fermer_tout,
                                          font=('Comic Sans MS', 10))
            self.menu_fichier.add_separator()        
     
        def _new_sheet(self, nom_fichier):
            """création d'une nouvelle feuille"""
            f1 = tkinter.Frame(self.ong, bg='gray', bd=1)
            s1 = tkinter.Scrollbar(f1, orient=tkinter.VERTICAL)
            texte1 = tkinter.Text(f1, wrap=tkinter.WORD)
            s1.config(command=texte1.yview)
            texte1.config(yscrollcommand=s1.set, font=('courier', 10),
                               background='white', foreground='black',
                               insertbackground='black',
                          )
            texte1.grid(column=0, row=0)
            s1.grid(column=1, row=0, sticky=tkinter.S+tkinter.N)
            self.ong.add(f1, text=nom_fichier)
            self.ong.select(self.ong.index('end')-1)
            texte1.focus_set()
            return texte1, self.ong.select()
     
        def nouvelle_feuille(self, event=None):
            """création d'une feuille vide"""
            texte, sheet = self._new_sheet('nouveau')
            self.fe.feuilles[sheet] = ['nouveau', texte]
     
        def ouverture_fichier(self, event=None):
            """ouverture d'un fichier grâce à tkFileDialog"""
            repertoire=''
            name = tkFileDialog.askopenfilename(initialdir=repertoire,
                                                filetypes =
                                                [("Fichiers Tex","*.tex"), 
                                                 ("Fichiers Python","*.py"),
                                                 ("Fichiers Python","*.gab"),
                                                 ("Tous", "*")])
            if name != '':
                f=open(name,"r")
                texte_fichier=f.read()
                f.close()
                texte, sheet = self._new_sheet(os.path.basename(name))
                self.fe.feuilles[sheet] = [name, texte]
                texte.insert(tkinter.INSERT, texte_fichier)
                texte.mark_set(tkinter.INSERT, "1.0")
     
        def fermer_tout(self, event=None):
            """Tout fermer"""
            self.fe.destroy()
     
    class Application():
     
        def __init__(self, to_open):
            self.root = tkinter.Tk()
            self.root.title("Essai de menus déroulants")
            self.root.feuilles = {}
            self.root.modification=[]
            self.onglet = ttk.Notebook(self.root)
            self.onglet.pack()
            self.onglet.enable_traversal()        
            self.menu_principal = tkinter.Menu(self.root, relief=tkinter.GROOVE,
                                               tearoff=0)
            self.barre_fichier = Fichier_menu(self.menu_principal, self.onglet,
                                              self.root)
            self.root.configure(menu=self.menu_principal)
            if to_open:
                self.barre_fichier._open_file(to_open)
            else:
                self.barre_fichier.nouvelle_feuille()
            self.root.bind_all('<Control-n>', self.barre_fichier.nouvelle_feuille)
            self.root.bind_all('<Control-o>', self.barre_fichier.ouverture_fichier)
            self.root.bind_all('<Control-q>', self.barre_fichier.fermer_tout)
            self.root.mainloop()
     
     
    if __name__ == '__main__':
        if len(sys.argv) > 1 and os.path.isfile(sys.argv[1]):
            Application(sys.argv[1])
        else:
            Application(None)
    Si vous tapez 3 lignes dans le fichier texte et que vous mettez le curseur sur la deuxième ligne puis tapez Ctrl o il ouvre la boite de dialogue mais insère une ligne entre la ligne 2 et la ligne 3...

    Encore merci pour vos réponses.

    Gabriel

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 347
    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 347
    Points : 36 870
    Points
    36 870
    Par défaut
    Salut,

    La question est ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.root.bind_all('<Control-o>', self.barre_fichier.ouverture_fichier)
    La réponse est dans la documentation tk sur le traitement des events et la précédence entre les différents "bind" identiques effectués sur instance, classe...

    Jouez avec:
    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
    import tkinter as tk
    from tkinter.constants import *
     
    def ctrlo(event):
        print ('ctrl-o', event.widget)
     
    class Text(tk.Text):
        def __init__(self, parent=None, **opts):
            super().__init__(parent, **opts)
    #        self.bind('<Control-o>', ctrlo)
     
    t = Text(root, height=20, width=50)
    t.pack(fill=BOTH)
    root = t.master
    root.bind_all('<Control-o>', ctrlo)
    tk.mainloop()
    - W

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 147
    Points : 64
    Points
    64
    Par défaut
    Ok merci.
    Je suis donc arrivé à ce code là... et çà a l'air de fonctionner.
    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
    import tkinter as tk
    from tkinter.constants import *
     
    def ctrlo(event):
        print ('ctrl-o', event.widget)
     
    class Text(tk.Text):
        def __init__(self, parent=None, **opts):
            super().__init__(parent, **opts)
    #        self.bind('<Control-o>', ctrlo)
     
    root=tk.Tk() 
    t = Text(root, height=20, width=50)
    t.pack(fill=BOTH)
    root = t.master
    root.bind_class("Text", "<Control-o>", ctrlo)
    tk.mainloop()
    Encore merci
    Gabriel

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 02/04/2008, 17h30
  2. problème d'attribution d'un texte dans un widget text
    Par polo42 dans le forum Général Python
    Réponses: 5
    Dernier message: 11/07/2007, 08h34
  3. couleur du curseur dans un widget text Tk
    Par thieduvar dans le forum Tkinter
    Réponses: 1
    Dernier message: 08/07/2007, 22h39
  4. Prb affichage de "¬" dans un widget text
    Par Eileen dans le forum Tkinter
    Réponses: 2
    Dernier message: 03/06/2007, 07h14
  5. colorier une colonne dans un widget text
    Par Chris33 dans le forum Tkinter
    Réponses: 4
    Dernier message: 14/09/2006, 11h20

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