2 votes

Ajout et suppression dynamique de cases d'entrée Tkinter

Je suis en train de faire une interface graphique qui donne à un utilisateur une série de champs de saisie en fonction du type de distribution statistique qu'il a sélectionné. Cela sera utilisé dans un calcul ultérieur dans le script. Chaque distribution statistique nécessite un nombre différent de variables (d'où la nécessité de remplir dynamiquement un certain nombre de champs de saisie). Pour l'instant, mon code fonctionne un peu. Le problème est que si vous sélectionnez une distribution qui vous donne 5 champs de saisie, puis passez à une distribution qui n'en nécessite que 3, les 5 champs de la sélection précédente restent là. Pour ce script, une distribution normale tronquée est censée avoir 3 variables, une distribution normale est censée avoir 5 variables et une distribution discrète est censée avoir 4 variables.

Je pensais que si je créais un champ de saisie factice et que je le supprimais à la fin de l'instruction if, cela supprimerait le(s) champ(s) dont je n'ai pas besoin. Cependant, cela ne semble pas avoir fonctionné.

Voici le code que j'ai jusqu'à présent. J'ai l'impression d'être presque arrivé et de manquer quelque chose. J'apprécierais grandement tout conseil. Encore une fois, l'objectif est de remplir juste le bon nombre de champs de saisie pour chaque sélection de distribution statistique, puis de pouvoir changer cette sélection dynamiquement et que le nombre de champs de saisie change en conséquence.

import tkinter as tk
from tkinter.ttk import *

master = tk.Tk()
master.title("Calculateur de Gaz")
v = tk.IntVar()
combo = Combobox(master)

def callbackARS(eventObject):
    ARDist=(comboARS.get())

    if ARDist == "Normal tronquée":
        a1 = tk.Entry(master)
        a2 = tk.Entry(master)
        a3 = tk.Entry(master)
        #tentative de création d'un champ de saisie factice qui n'est pas nécessaire et de le supprimer à la fin du code
        a4 = tk.Entry(master)
        a1.grid(row=3, column=4)
        a2.grid(row=3, column=5)
        a3.grid(row=3, column=6)
        a4.grid(row=3, column=7)
        tk.Label(master, text="Variable", padx=20, width=10, bg = "light blue").grid(row=2,column=4)
        tk.Label(master, text="Zone", padx=20, width=10, bg = "light blue").grid(row=2,column=5)
        tk.Label(master, text="Épaisseur", padx=20, width=10, bg = "light blue").grid(row=2,column=6)
        tk.Label(master, text="", padx=20, width=10, bg = "light blue").grid(row=2,column=7)
        #tentative de création d'un champ de saisie factice qui n'est pas nécessaire et de le supprimer à la fin du code
        a4.grid_remove()

    if ARDist == "Normal":
        b1 = tk.Entry(master)
        b2 = tk.Entry(master)
        b3 = tk.Entry(master)
        b4 = tk.Entry(master)
        b5 = tk.Entry(master)
        b1.grid(row=3, column=4)
        b2.grid(row=3, column=5)
        b3.grid(row=3, column=6)
        b4.grid(row=3, column=7)
        b5.grid(row=3, column=8)
        tk.Label(master, text="a", padx=20, width=10, bg = "light blue").grid(row=2,column=4)
        tk.Label(master, text="Aa", padx=20, width=10, bg = "light blue").grid(row=2,column=5)
        tk.Label(master, text="aaa", padx=20, width=10, bg = "light blue").grid(row=2,column=6)
        tk.Label(master, text="aaaa", padx=20, width=10, bg = "light blue").grid(row=2,column=7)

    if ARDist == "Discret":
        a1 = tk.Entry(master)
        a2 = tk.Entry(master)
        a3 = tk.Entry(master)
        a4 = tk.Entry(master)
        a1.grid(row=3, column=4)
        a2.grid(row=3, column=5)
        a3.grid(row=3, column=6)
        a4.grid(row=3, column=7)

#Sélection de la distribution
comboARS = Combobox(master)
comboARS['values']= ("Normal tronquée", "Normale", "Discret")
comboARS.current(0) #définir l'élément sélectionné
comboARS.grid(row=3, column=3)
comboARS.bind("<>", callbackARS)

0voto

R Spark Points 173

Si vous créez un seul ensemble d'étiquettes et de champs d'entrée dans un cadre, vous pouvez facilement manipuler leurs propriétés et leur visibilité. Les combinaisons des méthodes grid_remove() et winfo_children() sont assez utiles.

import tkinter as tk
from tkinter import ttk

master = tk.Tk()
my_frame = tk.Frame()
my_frame.grid(row=0, column=1)
# créez un ensemble de widgets dans un cadre
for num in range(1, 6):
    tk.Label(master=my_frame).grid(row=0,column=num)
    tk.Entry(master=my_frame).grid(row=1, column=num)
def detect_selection(eventobject):
    the_selection = eventobject.widget.get()
    # masquer tous les widgets
    for item in my_frame.winfo_children():
        item.grid_remove()
    show_idx__wigets = 6
    if the_selection == '3':
        change_labeltext(('a', 'b', 'c'), 6)
    if the_selection == '4':
        show_idx__wigets = 8
        change_labeltext(('d', 'e', 'f', 'g'), 8)
    if the_selection == '5':
        show_idx__wigets = 10
        change_labeltext(('h', 'i', 'j', 'k', 'l'), 10)
    # révéler seulement le nombre désiré de widgets
    show_widgets(show_idx__wigets)

def show_widgets(jusqu_pos_widget):
    for item in my_frame.winfo_children()[:upto_widgetposition]:
        item.grid()
def change_labeltext(labeltext, jusqu_pos_widget):
    for txt, item in zip(
        labeltext, my_frame.winfo_children()[:upto_widgetposition:2]):
        item['text'] = txt    
combo = ttk.Combobox(master,
                     values=(3,4,5))
combo.grid(row=0, column=0, sticky='s')
combo.bind('<>', detect_selection)

master.mainloop()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X