Listbox recuperation de variable

Résolu/Fermé
eXe76000 Messages postés 4 Date d'inscription lundi 26 février 2024 Statut Membre Dernière intervention 26 février 2024 - 26 févr. 2024 à 01:51
 XCode - 26 févr. 2024 à 15:26

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 23522 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 9 avril 2025 Ambassadeur 1 578
26 févr. 2024 à 09:13

bonjour,

label_c.get(tk.ACTIVE)
1
eXe76000 Messages postés 4 Date d'inscription lundi 26 février 2024 Statut Membre Dernière intervention 26 février 2024
Modifié le 26 févr. 2024 à 10:55

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

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 23522 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 9 avril 2025 1 578
26 févr. 2024 à 14:10

plus simple,

["","Madame", "Monsieur"]
0

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 217 Date d'inscription vendredi 25 novembre 2022 Statut Membre Dernière intervention 7 mars 2025 55
26 févr. 2024 à 11:34

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