Динамически добавляя и удаляя поля ввода Tkinter - PullRequest
0 голосов
/ 20 мая 2018

Я пытаюсь создать графический интерфейс, который дает пользователю диапазон полей ввода в зависимости от того, какой тип статистического распределения они выбрали.Это будет использовано в расчете позже в скрипте.Каждое статистическое распределение требует различного количества переменных (следовательно, необходимо динамически заполнять несколько полей ввода).Прямо сейчас мой код вроде работает.Проблема заключается в том, что если вы выберете распределение, которое дает вам 5 полей ввода, а затем переключите распределение на то, которое требует только 3, то 5 полей из предыдущего выбора все еще будут там.Для этого сценария усеченное нормальное распределение должно иметь 3 переменные, нормальное распределение должно иметь 5 переменных, а дискретное распределение должно иметь 4 переменные.

Я думал, что если бы я создал фиктивное поле вводаа затем удалите его в конце оператора if, и в итоге удалите те поля, которые мне не нужны.Это, похоже, не сработало.

Ниже приведен код, который у меня есть.Я чувствую, что я почти на месте и просто что-то упустил.Буду очень признателен за любые советы.Опять же, цель состоит в том, чтобы заполнить только правильное количество полей ввода для каждого статистического распределения распределения, а затем иметь возможность динамически изменять этот выбор и соответственно изменять количество полей ввода.

import tkinter as tk
from tkinter.ttk import *

master = tk.Tk()
master.title("Gas Calculator")
v = tk.IntVar()
combo = Combobox(master)

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


    if ARDist == "Truncated Normal":
        a1 = tk.Entry(master)
        a2 = tk.Entry(master)
        a3 = tk.Entry(master)
        #attempt to create a dummy input box that isnt needed and then delete it at the end of the 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="Area", padx=20, width=10, bg = "light blue").grid(row=2,column=5)
        tk.Label(master, text="Thickness", 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)
        #attempt to create a dummy input box that isnt needed and then delete it at the end of the 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 == "Discrete":
        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)

#Distribution selction
comboARS = Combobox(master)
comboARS['values']= ("Truncated Normal", "Normal", "Discrete")
comboARS.current(0) #set the selected item
comboARS.grid(row=3, column=3)
comboARS.bind("<<ComboboxSelected>>", callbackARS)

1 Ответ

0 голосов
/ 21 мая 2018

Если вы создадите один набор меток и полей ввода во фрейме, вы можете легко управлять их свойствами и видимостью.Комбинации методов grid_remove () и winfo_children () довольно полезны.

import tkinter as tk
from tkinter import ttk

master = tk.Tk()
my_frame = tk.Frame()
my_frame.grid(row=0, column=1)
# create one set of widgets in a frame
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()
    # hide all 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)
    # reveal only desired number of widgets
    show_widgets(show_idx__wigets)

def show_widgets(upto_widgetposition):
    for item in my_frame.winfo_children()[:upto_widgetposition]:
        item.grid()
def change_labeltext(labeltext, upto_widgetposition):
    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('<<ComboboxSelected>>', detect_selection)

master.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...