Listbox recuperation de variable

Résolu
eXe76000 Messages postés 4 Date d'inscription   Statut Membre Dernière intervention   -  
 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

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 

bonjour,

label_c.get(tk.ACTIVE)
1
eXe76000 Messages postés 4 Date d'inscription   Statut Membre Dernière intervention  
 

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
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
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 

plus simple,

["","Madame", "Monsieur"]
0
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
Diablo76 Messages postés 246 Date d'inscription   Statut Membre Dernière intervention   77
 

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