Получение значений из полей ввода данных Python

Рейтинг: 0Ответов: 1Опубликовано: 20.04.2023

При нажатии кнопки "+" происходит автоматическое добавление строки с ячейками для ввода данных. Пользователь добавляет их столько, сколько считает нужным. Никак не удается получить эти значения и произвести расчет при нажатии кнопки "Calc". Получаю ошибку о том, что значение переменной с методом get не получено.

from tkinter import ttk
from tkinter.scrolledtext import ScrolledText
import math

window = Tk()
window.title ('ECD')
window.geometry ('1880x870+30+30')

row_counter = 2

def row_add():
    global row_counter 
    label_text = str(row_counter-1) + '.'
    Label(window, text=label_text, background=bg1, font='Arial 8 bold').grid(row=row_counter, 
    column=0, padx=0,  pady=0, sticky='w'+'e'+'n'+'s')

    Label(window, text='Casing ID', background=bg1).grid(row=row_counter,  column=1,  padx=0,  
    pady=0, sticky='w')
    options_casing_id = ["mm", "in"]
    casing_id_units = StringVar(value=options_casing_id[0])
    casing_id_combobox = ttk.Combobox (window, textvariable = casing_id_units, 
    values=options_casing_id, width=4)
    casing_id_combobox.grid(row=row_counter, column=2, padx=0, pady=0, sticky='e')
    casing_id_entry = ttk.Entry(window, width=10) 
    casing_id_entry.grid(row=row_counter, column=3, padx=5, pady=5, sticky='w'+'e'+'n'+'s')

    row_counter += 1


def data_get():
    global casing_id_entry
    casing_id = float(casing_id_entry.get())
    ecd = casing_id * 1000
    st.insert(END, 'ECD = ' + str(round(ecd, 2)) + ' ppg\n')

#Создаю виджеты
Button(window, command=row_add, width=3, text='+', font='Arial 8 bold').grid(row=1,  column=0,  padx=5,  pady=5, sticky='w'+'e'+'n'+'s')
Button(window, width=3, text='Calc', font='Arial 8 bold', command=data_get).grid(row=2,  column=0,  padx=5,  pady=5, sticky='w'+'e'+'n'+'s')


#Вывод результатов
st = ScrolledText(window, width=260,  height=10, bd=1.5, font = 'Arial 10')
st.grid(row=6, padx=5, pady=5, sticky='w'+'e'+'n'+'s')


window.mainloop() ```

Ответы

▲ 0Принят

Если кто-то столкнется с подобной проблемой, я решил ее так:

#Функция добавления строк с ячейками ввода данных создает списки полей Entry
def row_add():
    global row_counter

    label_text = str(row_counter-2) + '.'
    Label(up_frame, text=label_text, background=bg1, font='Arial 8 bold').grid(row=row_counter, column=0, padx=0,  pady=0, sticky='w'+'e'+'n'+'s')

    Label(up_frame, text='Drill Bit Diameter', background=bg1).grid(row=row_counter,  column=1,  padx=0,  pady=0, sticky='w')
    bit_id_entry = ttk.Entry(up_frame, width=10) 
    bit_id_entry.grid(row=row_counter, column=2, padx=5, pady=5, sticky='w'+'e'+'n'+'s')

    row_counter += 1

    bit_id_list.append(bit_id_entry)
    
    return
#Затем создаю списки для значений из ячеек
def calc():
    big = [] #один большой для всех параметров
    bit_id_values=[] #и маленькие под конкретные наборы ячеек
   
    def data_get():                                      
        for bit_id_entry in bit_id_list:
            bit_id_values.append(float(bit_id_entry.get())/25.4)
         
        return (bit_id_values)
    
    bit_id_values = data_get()

    for i in range(len(bit_id_values)):
        big.append([bit_id_values[i]])
#Произвожу вычисления с использованием списка списков    
    for j in big:
        bit_id_values_a = j[0]
       
        Va = (0.7854 * float(bit_id_values_a)*(math.pow(0.2207, 2))*1000

#вывожу результаты в поле Scrolltext

        st.insert(END, 'Well volume  ' + str(round(Va, 2)) + '\n')