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 :

Auto Focus sur Treeview


Sujet :

Tkinter Python

  1. #1
    Invité
    Invité(e)
    Par défaut Auto Focus sur Treeview
    Bonjour à tous,

    le but est d'obtenir la surbrillance d'une des lignes affichée par un Treeview (qu'une présélection soit déjà proposée)
    ces deux informations indique qu'il faut passer par iid
    https://www.tfzx.net/index.php/article/7067497.html
    https://stackoverflow.com/questions/...a-row/53152722
    (Renvoie un tuple des valeurs iid des enfants de l'élément spécifié par l'argument élément. S'il est omis, vous obtenez un tuple contenant les valeurs iid des éléments de niveau supérieur. )
    ---> exemple : Rec_list.get_children() ('I001', 'I002', 'I003', 'I004'

    mes essais ne donnent rien
    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
     
    # coding:utf-8
    #version 3.x python
     
    from tkinter import *
    from tkinter.ttk import *
    from tkinter import ttk
     
     
    def Load_Recette_Contenu():
     
        Load_Recette = tk.Toplevel()
        Load_Recette.title("Ouvrit une recette SAF")
        Load_Recette.geometry("325x178+0+0")
        Load_Recette.resizable(width=False, height=False)                                            # Fenêtre verrouillée
        Load_Recette.attributes("-toolwindow", 1)                                                         # Supprime les boutons Réduire/Agrandir
        Load_Recette.attributes("-topmost", 1)                                                             # au premier plan
     
     
        # ==================================================
        #                              TreeView
        # ==================================================
     
     
        # --- Insertion Table Nom HV dans TreeView
        def DisplayData():
            for i in Recette_DB_BackEnd.loadRecord():
                # print("Nom de la recette --> ", i[0])
                Rec_list.insert('', 'end', text=i[0], values=(i[0]))
     
        # --- Insertion Scrollbar
        scrollbar_y = Scrollbar(Recette_TreView, orient='vertical')                                 # Ascenseur Vertical
        scrollbar_y.place(x=299, y=0, height=169)
     
     
        Rec_list = ttk.Treeview(Recette_TreView, selectmode="browse", columns=(1), show="headings", yscrollcommand=scrollbar_y.set) 
        # --- En-tête
        Rec_list.heading('#1', text="Recettes")
        # --- Largeur Colonnes
        Rec_list.column('#1', width=300, minwidth=40, stretch=OFF)
        Rec_list.place(x=0, y=0, width=301, height=168)
     
        scrollbar_y.config(command=Rec_list.yview)                                                       # Ascenseur Vertical
     
        DisplayData()
     
     
     
        def selectionItem(a):
            # === [Sélection - Widget Treeview] ===
     
     
            curItem = Rec_list.focus()
            Liste = Rec_list.item(curItem)["values"]
            # print("winfo_name()", Rec_list.winfo_name())                                            # ID widget Treeview -- Exemple : winfo_name() !treeview
            # print("Liste - TreeView - Recette sélectionnée", Liste)                                 # Affiche la sélection contenu de la liste
            # print("Liste - TreeView - Colonne Nom -->", Liste[0])
            # for child in Rec_list.get_children():                                                            # Listing du contenu de la Treeview -- Exemple : ['Recette_2020.05_8_30.5_NoName']
            #     print(Rec_list.item(child)["values"])
            # print("Rec_list.item(curItem)[","values","][0]          ", Rec_list.item(curItem)["values"][0])                                   # Affiche Nom recette depuis Treeview -- Exemple : Recette_2020.05_8_30.5_NoName
            # print("Rec_list.get_children()", Rec_list.get_children())                                                                                       # iid -- Renvoie un tuple des valeurs iid des enfants de l'élément spécifié par l'argument élément. S'il est omis, vous obtenez un tuple contenant les valeurs iid des éléments de niveau supérieur.  --- exemple : Rec_list.get_children() ('I001', 'I002', 'I003', 'I004')
            # print("Rec_list.get_children()[0]", Rec_list.get_children()[0])
     
            # print("Rec_list.get_children()", Rec_list.get_children([Rec_list.item(curItem)["values"][0]]))   ????????????????????
     
            Rec_list.selection_set(Rec_list.get_children()[1])
            Rec_list.focus_set()
            Rec_list.focus(Rec_list.get_children()[1])
     
     
        # ==================================================
        #                              Evénement Treeview
        # ==================================================
        # via souris
        Rec_list.bind('<ButtonRelease-1>', selectionItem)                                         # Le bouton de la souris a été relâché
    je suis obligé d'activer Rec_list.bind ...., puis cliquer sur une des lignes pour que la ligne cible soit effectivement mise ne surbrillance
    votre aide est la bien venue. merci de votre temps
    Dernière modification par Invité ; 01/06/2020 à 10h46.

  2. #2
    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 781
    Points
    36 781
    Par défaut
    Salut,

    Citation Envoyé par taratatasoleil Voir le message
    le but est d'obtenir la surbrillance d'une des lignes affichée par un Treeview (qu'une présélection soit déjà proposée)
    La surbrillance d'un item peut s'obtenir avec des "tags".

    Si on veut positionner la selection et le focus sur un item particulier (ce qui donne aussi une sur-chose qui montre quelle ligne est sélectionnée), çà se fait via .focus(iid) ou .selection_set(iid)iid est l'identifiant de la ligne retourné par .insert.

    Je peux poster un exemple de plus que ceux que vous avez déjà trouvé:
    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
    import tkinter.ttk as ttk
     
    tree = ttk.Treeview()
    for i in range(10):
        iid = tree.insert('', 'end', text=i)
    tree.pack()
     
    def move_bottom():
        iid = tree.get_children('')[-1]
        if iid != tree.focus():
            tree.focus(iid)
            tree.selection_set(iid)
     
    tk.Button(text='move', command=move_bottom).pack()
    tree.mainloop()
    mais comme je ne comprends pas trop ce que vous herchez à faire dans le code que vous avez posté, pas sûr que çà aide plus.

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

  3. #3
    Invité
    Invité(e)
    Par défaut
    merci pour votre réponse,

    je passe bien par l'identifiant iid (cela fonctionne bien)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Rec_list.get_children()   <--- tous les identifiants 
    Rec_list.get_children()[0]   <--- identifiant ciblé
    le but est qu'une fois la surbrillance positionnée sur un Item, qu'il soit automatiquement sélectionné sans intervention de la souris ou clavier.
    A ce stade, il me faut connaitre l'état d'un bouton de souris pour le changer en actif.

    Au final, ce sera une auto sélection de item du treview pour être afficher dans une frame.

  4. #4
    Invité
    Invité(e)
    Par défaut
    actuellement, la sélection et la mise en surbrillance fonctionne correctement vis idd

    mes recherches sur l'état du bouton souris ou touche clavier ne donne rien.
    Est-il possible, de changer l'état d'un bouton afin de simuler le click?

    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
     
    # coding:utf-8
    #version 3.x python
     
    from tkinter import *
    from tkinter.ttk import *
    from tkinter import ttk
     
     
    def Load_Recette_Contenu():
     
        Load_Recette = tk.Toplevel()
        Load_Recette.title("Ouvrit une recette SAF")
        Load_Recette.geometry("325x178+0+0")
        Load_Recette.resizable(width=False, height=False)                                            # Fenêtre verrouillée
        Load_Recette.attributes("-toolwindow", 1)                                                         # Supprime les boutons Réduire/Agrandir
        Load_Recette.attributes("-topmost", 1)                                                             # au premier plan
     
     
        # ==================================================
        #                              TreeView
        # ==================================================
     
     
        # --- Insertion Table Nom HV dans TreeView
        def DisplayData():
            for i in Recette_DB_BackEnd.loadRecord():
                # print("Nom de la recette --> ", i[0])
                Rec_list.insert('', 'end', text=i[0], values=(i[0]))
     
        # --- Insertion Scrollbar
        scrollbar_y = Scrollbar(Recette_TreView, orient='vertical')                                 # Ascenseur Vertical
        scrollbar_y.place(x=299, y=0, height=169)
     
     
        Rec_list = ttk.Treeview(Recette_TreView, selectmode="browse", columns=(1), show="headings", yscrollcommand=scrollbar_y.set) 
        # --- En-tête
        Rec_list.heading('#1', text="Recettes")
        # --- Largeur Colonnes
        Rec_list.column('#1', width=300, minwidth=40, stretch=OFF)
        Rec_list.place(x=0, y=0, width=301, height=168)
     
        scrollbar_y.config(command=Rec_list.yview)                                                       # Ascenseur Vertical
     
        DisplayData()
     
     
     
        def selectionItem(a):
            # === [Sélection - Widget Treeview] ===
     
     
            curItem = Rec_list.focus()
            Liste = Rec_list.item(curItem)["values"]
            # print("winfo_name()", Rec_list.winfo_name())                                            # ID widget Treeview -- Exemple : winfo_name() !treeview
            # print("Liste - TreeView - Recette sélectionnée", Liste)                                 # Affiche la sélection contenu de la liste
            # print("Liste - TreeView - Colonne Nom -->", Liste[0])
            # for child in Rec_list.get_children():                                                            # Listing du contenu de la Treeview -- Exemple : ['Recette_2020.05_8_30.5_NoName']
            #     print(Rec_list.item(child)["values"])
            # print("Rec_list.item(curItem)[","values","][0]          ", Rec_list.item(curItem)["values"][0])                                   # Affiche Nom recette depuis Treeview -- Exemple : Recette_2020.05_8_30.5_NoName
            # print("Rec_list.get_children()", Rec_list.get_children())                                                                                       # iid -- Renvoie un tuple des valeurs iid des enfants de l'élément spécifié par l'argument élément. S'il est omis, vous obtenez un tuple contenant les valeurs iid des éléments de niveau supérieur.  --- exemple : Rec_list.get_children() ('I001', 'I002', 'I003', 'I004')
            # print("Rec_list.get_children()[0]", Rec_list.get_children()[0])
     
            # print("Rec_list.get_children()", Rec_list.get_children([Rec_list.item(curItem)["values"][0]]))   ????????????????????
     
            z = -1
            for child in Rec_list.get_children():
                print(child)
                z = z +1
                Rec_list.selection_set(Rec_list.get_children()[z])
                Rec_list.focus_force()
                Rec_list.focus_set()
                Rec_list.focus(Rec_list.get_children()[z])
                time.sleep(3)
                Rec_list.update()
     
            # -- Identifie le type de bouton activé --
            # un bouton pressé(event.type = 4)
            # un bouton relaché(event.type = 5)
            # un bouton pressé en mouvement(event.type = 6)
            print("\ntype :", a.type)
            # -- Identifie quel bouton pressé --
            # clic gauche(Bouton 1): event.num = 1
            # clic droit(Bouton 3): event.num = 3
            print("num :", a.num)
            # Load_Recette.update()
            # Rec_list.event_generate('<ButtonPress-1>')
            # Load_Recette.update()
     
     
        # ==================================================
        #                              Evénement Treeview
        # ==================================================
        # via souris
        Rec_list.bind('<ButtonRelease-1>', selectionItem)                                         # Le bouton de la souris a été relâché

  5. #5
    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 781
    Points
    36 781
    Par défaut
    Salut,

    Si le problème est résolu, marquez la discussion sinon il faut préciser.

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

  6. #6
    Invité
    Invité(e)
    Par défaut
    une fois que la sélection et mise en surbrillance d'un Item est faite, il me faut connaitre l'état d'un bouton de souris pour le changer en actif.
    Je cherche à simuler un click souris sur le Item auto sélectionné.

    Au final, ce sera une auto sélection de item du treview pour être afficher dans une frame.

    je ne trouve rien sur une commande donnant l'état d'un bouton souris et comment y changer son état par 0 ou 1, je supose.

  7. #7
    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 781
    Points
    36 781
    Par défaut
    Salut,

    Simuler l'action sur un Button, c'est juste .invoke()...

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

  8. #8
    Invité
    Invité(e)
    Par défaut
    selon la documentation pour treeview il faut utiliser event_generate

    je ne passe pas par un bouton.
    Une fois l'auto surbrillance faite, un click souris doit se faire automatiquement.
    j'ai placé ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Rec_list.event_generate ('' .format (button-1), when = "now")
    sans succès

    s'il vous plaît, pouvez-vous me guider.

    Une bonne journée


  9. #9
    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 781
    Points
    36 781
    Par défaut
    Salut,

    Citation Envoyé par taratatasoleil Voir le message
    selon la documentation pour treeview il faut utiliser event_generate
    Ok mais la sélection de l'item se fait déjà dans un callback. Il peut très bien appeler directement la fonction callback appelée via l'event simulé par event_generate.

    Ce serait déjà un bon point de départ pour illustrer (avec du code) ce que vous cherchez à faire (que j'ai toujours peine à comprendre).

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

  10. #10
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    j'ai mis l'event simulé par event_generate dans la fonction "selectItem(a), appelent une fonction test
    mais j'obtient une erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Exception in Tkinter callback
    Traceback (most recent call last):
      File "C:\Users\master\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1705, in __call__
        return self.func(*args)
      File "C:/!TEST!/py/_Génèrer des controles dynamiquement - AutoClick/1/Main.py", line 61, in selectItem
        HElist.event_generate('<ButtonRelease-1>', when="now", command=test(HElist))
      File "C:\Users\master\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1673, in event_generate
        self.tk.call(args)
    _tkinter.TclError: bad option "-command": must be -when, -above, -borderwidth, -button, -count, -data, -delta, -detail, -focus, -height, -keycode, -keysym, -mode, -override, -place, -root, -rootx, -rooty, -sendevent, -serial, -state, -subwindow, -time, -warp, -width, -window, -x, or -y
    ce qui siginifie que command ne peut être placée comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HElist.event_generate('<ButtonRelease-1>', when="now", command=test(HElist))
    voici le 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
    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
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
     
    # coding:utf-8
    #version 3.x python
    import sys
    from tkinter import *
    from tkinter.ttk import *
    from tkinter import messagebox                              # Librairie des fenêtres d'alerte
     
    import time
     
    # ================= Liaison file py =========================
    import HV_DB_BackEnd
     
    class Main:
        def __init__(self, root):
            self.root = root
            self.root.geometry("620x660+0+0")
     
    if __name__ =='__main__':
        root = Tk()
        application = Main(root)
     
        # --- Déclaration Variables - Tableaux
        frames = []                     # Liste Frames
        global Liste_Full
        Liste_Full = []                  # Liste d'imbrication des L_List (sélection faites depuis Treeview)
     
        # ========================  Frames Master  ====================
        MainFrame = LabelFrame(root, text="[TEST]", relief=FLAT)
        MainFrame.place(x=5, y=5, width=650, height=600)
     
        FrameCalc_1 = Frame(name='labels', relief=FLAT)
        FrameCalc_1.place(x=5, y=415, width=650, height=300)
     
        # ========================  Fonctions  ========================
        def test(HElist):
            z = -1
            for child in HElist.get_children():
                z = z +1
                time.sleep(1)
                HElist.update()
                HElist.selection_set(HElist.get_children()[z])
                print("HElist.get_children()[z]", HElist.get_children()[z])
                HElist.focus_force()
                HElist.focus_set()
                HElist.focus(HElist.get_children()[z])
                HElist.update()
                print(child)
     
        # Création dynamiquement frame(s) contenant Labels selon la sélection faite depuis TreeView
        def selectItem(a):
            global frames
            var = IntVar()
            frame = Frame(FrameCalc_1)                                                                    # frame généré dans la frame master
     
            # === [Listing Table dans Widget Treeview] ===
            curItem = HElist.focus()
            Liste = HElist.item(curItem)["values"]
     
            # =======================================
     
            HElist.event_generate('<ButtonRelease-1>', when="now", command=test(HElist))
     
            # =======================================
     
            # === [Génére automatiquement de nouveaux widgets Labels] ===
            frame.configure(relief=GROOVE)
            frame.grid(row=len(frames) + 1, column=5, pady=1)                                       # Nb de Colonne à générer - pady=intervale entre la prochaine
            frame.columnconfigure(0, minsize=135)                                                      # Largeur de la Colonne
            frame.columnconfigure(1, minsize=30)
            frame.columnconfigure(2, minsize=30)
            frame.columnconfigure(3, minsize=50)
            frame.columnconfigure(4, minsize=30)
            frame.columnconfigure(5, minsize=80)
            frame.columnconfigure(6, minsize=0)
            var.set(len(frames))
     
            if len(frames) < 5:
                L_Line = []                                                                                           # Liste temporaire pour chaque sélection
                Champ_Table = [1,3,5]                                                                         # Liste des index de champ cible de la table cible à exploiter
     
                # -- Génére 3 Labels "Nom", "IODE", "NaOH"
                for i in range(len(Champ_Table)):
                    Label(frame, name='%s' % "lb_"+ str(i ), text=Liste[Champ_Table[i]]).grid(row=0, column=i)
                    ki = '%s' % "lb_"+ str(i)                                                                    # Nom Label - type str
                    L_Line.append(Liste[Champ_Table[i]])
     
                # -- Génère Label - Affiche le Nb de Frame généré
                l = Label(frame,  textvariable=var)
                l.grid(row=0, column=6)
     
                l.var = var
                frames.append(frame)                                                                           # liste des frames générée
     
                Liste_Full.append(L_Line[0:len(L_Line)])                                                  # Imbrique L_Line dans Liste_Full
     
        # [TreeView widgets] - Affiche Table
        def DisplayData():
            # Insertion Table BD dans TreeView
            a = 0
            for i in HV_DB_BackEnd.loadRecord():
                HElist.insert('', 'end', text=i[0], values=(i[0], i[1], i[2], i[3], i[4], i[5]))
                a = a + 1
     
        # ============================== Treeview & Scrollbar Vertical/Horizontal [XY] ========================
        scrollbar_y = Scrollbar(MainFrame, orient='vertical')  # Ascenseur Vertical
        scrollbar_y.place(x=600, y=24, height=350)
     
        HElist = Treeview(MainFrame, selectmode="browse", columns=(1,2,3,4,5,6), show="headings", yscrollcommand=scrollbar_y.set)
        # En-tête
        HElist.heading('#1', text="ID")
        HElist.heading('#2', text="Nom")
        HElist.heading('#3', text="C1")
        HElist.heading('#4', text="C2")
        HElist.heading('#5', text="C3")
        HElist.heading('#6', text="C4")
     
        HElist.place(x=2, y=2, width=600, height=400)
        # Cache colonne(s)
        exclusionlist = ['1']                                                   # Colonne [ID] exclue d'affichage
        displaycolumns = ['2', '3', '4', '5', '6']                          # Colonne [xxx] affichées
        for col in HElist["columns"]:
            if not "%s" % col in exclusionlist:
                pass
        HElist["displaycolumns"] = displaycolumns
     
        scrollbar_y.config(command=HElist.yview)                # Ascenseur Vertical
        HV_DB_BackEnd.loadRecord()
        DisplayData()
     
        HElist.bind('<ButtonRelease-1>',  selectItem)            # Le bouton de la souris a été relâché
     
        root.mainloop()

  11. #11
    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 781
    Points
    36 781
    Par défaut
    Salut,

    .event_generate c'est juste pour simuler un event (par exemple '<ButtonRelease-1>') sur un widget ou à une position donnée.

    Ce qui se passe après (le callback appelé) dépend des "bindings" qui ont été faits (ou déjà définis), il n'y a rien à appeler.

    Çà ne sert pas à grand chose de poster du code qu'on ne peut pas lancer (parce qu'il manque des bouts) et il est inutile de poster un code "long": un minimum de lignes suffit pour illustrer quelque chose.

    Essayez de partir de l'exemple que je vous ai posté précédemment et ajoutez y l'équivalent de l'interaction que vous souhaitez. Ça va vous aider à la décrire en faisant abstraction du reste.

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

  12. #12
    Invité
    Invité(e)
    Par défaut
    comme ceci ?

    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
     
    import tkinter as tk
    import tkinter.ttk as ttk
     
    import time
     
    tree = ttk.Treeview()
    for i in range(10):
    	iid = tree.insert('', 'end', text=i)
    tree.pack()
     
    def event_test(event):
    	print("event", event)
     
    def move_bottom():
    	iid = tree.get_children('')[2]
    	time.sleep(3)
    	if iid != tree.focus():
    		iid = tree.get_children('')[3]
    		tree.focus(iid)
    		tree.selection_set(iid)
    		print("iid", iid)
    		tree.after(1000, lambda: tree.event_generate('<<Declenche>>'))
     
    tree.event_add('<<Declenche>>', '<ButtonRelease-1>')
    tree.bind('<<Declenche>>', event_test)
    tk.Button(text='move', command=move_bottom).pack()
     
    tree.mainloop()

  13. #13
    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 781
    Points
    36 781
    Par défaut
    Je peux recopier le code et (pour moi) il fonctionne sans problème.

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

  14. #14
    Invité
    Invité(e)
    Par défaut
    La seul façon que j'ai trouvé pour le vérifier :

    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
     
    import tkinter as tk
    import tkinter.ttk as ttk
    import time
     
    tree = ttk.Treeview()
    for i in range(10):
    	iid = tree.insert('', 'end', text=i)
    tree.pack()
     
    def event_test(iid):
    	t['text'] = iid
    	print("iid", iid)
     
    def move_bottom():
    	iid = tree.get_children('')[-1]
    	time.sleep(1)
    	if iid != tree.focus():
    		iid = tree.get_children('')[5]
    		tree.focus(iid)
    		tree.selection_set(iid)
    		print("iid", iid)
     
    		tree.event_add('<<Declenche>>', '<ButtonRelease-1>')
    		tree.after(1000, lambda: tree.event_generate('<<Declenche>>'))
    		tree.bind('<<Declenche>>', event_test(iid))
     
    t = tk.Label()
    t.pack()
    tk.Button(text='move', command=move_bottom).pack()
     
    tree.mainloop()

  15. #15
    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 781
    Points
    36 781
    Par défaut
    Comme vous ne racontez rien sur ce que vous attendez et en quoi le code (que vous avez posté) ne le fait pas, je peux juste constater que le code "fonctionne" (e t éventuellement le simplifier, car je ne vois toujours pas l'intérêt d'event_generate, ni du time.sleep)

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

  16. #16
    Invité
    Invité(e)
    Par défaut
    voici le résultat


    merci pour votre aide
    bonne fin de journée

  17. #17
    Invité
    Invité(e)
    Par défaut
    j'ai un soucis pour appeler une fonction placée dans une autre.
    Je dois faire appel [selectItem(frame)] depuis [Display_Recette(Name_HV)]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def SAF_Contenu(root):
         def selectItem(frame):
     
    def Display_Recette(Name_HV):
        F_TOP_Treeview_ID.bind('<<Declenche>>', selectItem(iid))
    Dernière modification par Invité ; 06/06/2020 à 17h05. Motif: Ajout des balises [CODE] mon code [/CODE] (bouton #)

  18. #18
    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 781
    Points
    36 781
    Par défaut
    Citation Envoyé par taratatasoleil Voir le message
    j'ai un soucis pour appeler une fonction placée dans une autre.
    Une fonction à l'intérieur d'une autre fonction, c'est un peu comme une variable locale: elle n'existe que lorsque la fonction est "active".
    La boîte "class" est plus adaptée pour avoir différents points d'entrée.

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

  19. #19
    Invité
    Invité(e)
    Par défaut
    bonjour,

    cela signifie que la fonction [def selectItem(frame)] doit être écrite sous forme de class est placée en dehors de la fonction parent [def SAF_Contenu(root)]?

  20. #20
    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 781
    Points
    36 781
    Par défaut
    Salut,

    Ça veut dire que vous n'utilisez pas de fonction imbriquée dans ce cas là ou que vous utilisez des classes.

    On peut pousser le raisonnement en disant, puisqu'une fonction imbriquée est une variable locale, transformons là en variable globale.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    >>> def f(a):
    ...     global g
    ...     def g():
    ...         nonlocal a
    ...         a += 1
    ...         return a
    ...
    >>> f(10)
    >>> g()
    11
    >>> g()
    12
    >>>
    façon pas très conventionnelle de créer d'une "closure" (i.e. une fonction avec un état).

    La programmation est une activité de construction, faire simple avec des outils maîtrisés est plus raisonnable que de s'accrocher à un choix qui aura des implications qu'on ne sait pas anticiper.

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

Discussions similaires

  1. Auto focus sur une page a chaque fois que son contenu se change
    Par solicel dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 08/01/2010, 09h21
  2. [C#]garder le focus sur un node d'un treeview
    Par Blo0d4x3 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 09/05/2006, 21h23
  3. [C#][.Net 2.0] donner focus à Combobox, après click sur treeview
    Par Harry_polin dans le forum Windows Forms
    Réponses: 3
    Dernier message: 17/02/2006, 22h27
  4. focus sur un TreeView
    Par steph_1 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 07/11/2005, 13h50
  5. Pb d'auto-incrément sur une table v7
    Par Nivux dans le forum Paradox
    Réponses: 9
    Dernier message: 26/12/2002, 12h05

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