Listbox recuperation de variable

Résolu
eXe76000 Messages postés 4 Statut Membre -  
 XCode -

Bonjour tout le monde,

je suis actuellement sur un projet de petit script qui me permettra d'éditer un mail plus rapidement au boulot ce sont des mails type a quelques détails prêt. pour cela j'ai quelques Entry qui me permettent de modifier les paramètres dont j'ai besoin, le reste du texte est générer automatiquement via le script.

Tout fonctionne bien sauf au niveau d'une listbox pour choisir la civilité.

impossible de sortir le texte en question (Monsieur ou Madame)

je ne vois pas ou je me plante si quelqu'un sait m'aider.

merci beaucoup d'avance 

voici le code en question 

import tkinter as tk

def generate_and_insert_message():
     
    msg_structure = [
            entry_name.get(),
            ",\n\n",
            "Veuillez trouver bla bla bla...",
            "\n",
            entry_desc_ot.get(),
            "\n",
            entry_num_ot.get(),
            "\n",
            entry_tax_amount.get(),
            "\n\n",
            "Cordialement."]
    
    selection = label_c.curselection()
    selected_item = label_c.get(selection)
    text_generated.delete(1.0, tk.END)
    text_generated.insert("1.0", "".join(value for value in msg_structure))
 
 
 
fenetre = tk.Tk()

label_c = tk.Label(fenetre, text="Civilité : ")
label_c.grid(column=0, row=1, sticky="nw", pady=2)
label_c = tk.Listbox(fenetre, width=31, height=0)
label_c.grid(column=1, row=1, columnspan=2)
for item in ["Madame", "Monsieur"]:
    label_c.insert(tk.END, item)
 
label_name = tk.Label(fenetre, text="Nom : ")
label_name.grid(column=0, row=3, sticky="w", pady=2)
entry_name = tk.Entry(fenetre, width=31)
entry_name.grid(column=1, row=3, columnspan=2)
 
label_desc_ot = tk.Label(fenetre,text="Description OT : ",)
label_desc_ot.grid(column=0, row=4, sticky="w", pady=2)
entry_desc_ot = tk.Entry(fenetre, width=31)
entry_desc_ot.grid(column=1, row=4, columnspan=2)
 
label_num_ot = tk.Label(fenetre, text="Numéro de l'OT : ")
label_num_ot.grid(column=0, row=5, sticky="w", pady=2)
entry_num_ot = tk.Entry(fenetre, width=31)
entry_num_ot.grid(column=1, row=5, columnspan=2)
 
label_tax_amount = tk.Label(fenetre, text="Montant de la taxe : ")
label_tax_amount.grid(column=0, row=6, sticky="w", pady=2)
entry_tax_amount = tk.Entry(fenetre, width=31)
entry_tax_amount.grid(column=1, row=6, columnspan=2)
 
label_generated_text = tk.Label(fenetre, text="Texte généré : ")
label_generated_text.grid(column=0, row=12, sticky="w", pady=2)
text_generated = tk.Text(fenetre, height=10, width=33)
text_generated.grid(column=1)
 
but_generate_text = tk.Button(fenetre, text="Générer", command=generate_and_insert_message, pady=2)
but_generate_text.grid(column=1, row=11, sticky="sw", pady=20)
 
entry_name.focus_set()

fenetre.mainloop()

4 réponses

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     

    bonjour,

    label_c.get(tk.ACTIVE)
    1
  2. eXe76000 Messages postés 4 Statut Membre
     

    Merci beaucoup c'etait bête effectivement... des fois faut pas voir plus loin que le bout de son nez je commencais a m'arracher les cheveux

    0
  3. calicot_rouge
     

    Salut.

    Le souci avec tk.ACTIVE est que même s'il n'y a pas eu de sélection de la part de l'utilisateur, est qu'il y en a une par défaut, la première.

    Un simple exemple de comment j'aurais fait.

    import tkinter as tk
    
    TITLES = (
        'Madame',
        'Mademoiselle',
        'Monsieur',
    )
    
    def show(listbox, label):
        try:
            index = listbox.curselection()[0]
        except IndexError:
            # Aucun item sélectionné
            return
        values = listbox.getvar(listbox.cget('listvariable'))
        label['text'] = values[index]
    
    window = tk.Tk()
    
    title_var = tk.StringVar(value=TITLES)
    title_box = tk.Listbox(
        window,
        height=len(TITLES),
        bg='white',
        fg='blue',
        selectbackground='blue',
        selectforeground='white',
        selectmode=tk.SINGLE,
        listvariable=title_var,
    )
    title_box.grid()
    
    # for k, v in title_box.config().items():
        # print(k, v)
    
    def listbox_scroll(evt, listbox):
        try:
            index = title_box.curselection()[0]
            listbox.selection_clear(index)
        except IndexError:
            index = 0
        else:
            if index < listbox.size() - 1 and (evt.keysym == 'Down' or evt.num == 5):
                index += 1
            elif index > 0 and (evt.keysym == 'Up' or evt.num == 4):
                index -= 1
        listbox.selection_set(index)
    
    result_label = tk.Label(window)
    result_label.grid()
    
    validate_button = tk.Button(
        window, text='Afficher',
        command=lambda: show(title_box, result_label),
    )
    validate_button.grid()
    
    title_box.bind('<Up>', lambda evt: listbox_scroll(evt, title_box))
    title_box.bind('<Down>', lambda evt: listbox_scroll(evt, title_box))
    # Windows scroll
    title_box.bind("<MouseWheel>", lambda evt: listbox_scroll(evt, title_box))
    # Unix scroll
    title_box.bind('<Button-4>', lambda evt: listbox_scroll(evt, title_box))
    title_box.bind('<Button-5>', lambda evt: listbox_scroll(evt, title_box))
    
    window.mainloop()

    Je pense tout de même qu'un menu (Menubutton et Menu) serait bien mieux adapté pour faire cela, mais plus complexe à mettre en œuvre.

    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       

      plus simple,

      ["","Madame", "Monsieur"]
      0
    2. XCode
       

      Ou une comboBox avec ttk.

      import tkinter as tk
      from tkinter import ttk
      
      def afficheChoix():
          print(comboBox.get())
      
      root = tk.Tk() 
      root.geometry('300x200')
      
      labelChoix = tk.Label(root, text = "Veuillez faire un choix !")
      labelChoix.pack()
      
      civilite=["Monsieur", "Madame", "Maitre", "Docteur", "Docteure"]
      
      comboBox = ttk.Combobox(root, values=civilite)
      comboBox.current(0)
      comboBox.pack()
      
      bouton = tk.Button(root, text="Choix", command=afficheChoix)
      bouton.pack()
      
      root.mainloop()
      0
  4. Diablo76 Messages postés 344 Date d'inscription   Statut Membre Dernière intervention   140
     

    Ouais....

    Tu aurais pu prendre le temps et la peine de répondre à l'intervenant qui t'a aidé sur l'autre forum avant de poster ici.

    0