Передача данных из виджета в функцию

Подскажите, пожалуйста, как правильно организовать передачу данных между виджетами tkinter и функцией.

В txtSmax и txtCons вводятся числа, по нажатию на кнопку нужно передать их в функцию select(), а из функции получить строку, которая выведется в окне приложения (в markSelect1).

from tkinter import *
from tkinter import ttk


def select():
    s = int()
    e = int() / 100
    list_tr = [10, 16, 25, 40]
    var_a = s * (1 - 0) / 1.4
    var_b = s * (1 - 0.5 * e) / 1.4
    var_c = s * (1 - e) / 1.4
    E = []
    for i in range(len(list_tr)):
        if list_tr[i] > var_a:
            E.append(list_tr[i])
            break
    for i in range(len(list_tr)):
        if list_tr[i] > var_b:
            E.append(list_tr[i])
            break
    for i in range(len(list_tr)):
        if list_tr[i] > var_c:
            E.append(list_tr[i])
            break
    for i in range(len(E)):
        if E[i] < 17:
            E[i] = 'ТДН-' + str(E[i]) + '000'
        else:
            E[i] = 'ТРДН-' + str(E[i]) + '000'
    return ' '.join(E)


class Window:

    def __init__(self, width, heigth, title):
        self.root = Tk()
        self.root.title(title)
        self.root.geometry(f"{width}x{heigth}")

        self.tabs_control = ttk.Notebook(self.root)
        self.tab1 = Frame(self.tabs_control)
        self.tabs_control.add(self.tab1, text='Основа')
        self.markSmax = Label(self.tab1, text='Smax')
        self.txtSmax = Entry(self.tab1, width=10)
        self.markCons = Label(self.tab1, text='Кол-во потребителей 3й категории, %')
        self.txtCons = Entry(self.tab1, width=10)
        self.markSelect = Label(self.tab1, text='Подбор трансформатора')
        self.btnSelect = Button(self.tab1, text='Расчет', command=select())
        self.markSelect1 = Label(self.tab1, text=select())
        s = self.txtSmax.get()
        e = self.txtCons.get()

    def run(self):
        self.draw_widjets()
        self.root.mainloop()

    def draw_widjets(self):

        self.tabs_control.pack(fill=BOTH, expand=1)
        self.markSmax.grid(column=0, row=0, padx=5, pady=5)
        self.txtSmax.grid(column=0, row=1, padx=5, pady=5)
        self.markCons.grid(column=0, row=2, padx=5, pady=5)
        self.txtCons.grid(column=0, row=3, padx=5, pady=5)
        self.markSelect.grid(column=5, row=0, padx=5, pady=5)
        self.btnSelect.grid(column=5, row=1, padx=5, pady=5)
        self.markSelect1.grid(column=5, row=2, padx=5, pady=5)


if __name__ == '__main__':
    window = Window(500, 200, 'Тепловой расчет')
    window.run()

Ответы (2 шт):

Автор решения: S. Nick

Попробуйте так:

from tkinter import *
from tkinter import ttk


class Window:
    def __init__(self, width, heigth, title):
        self.root = Tk()
        self.root.title(title)
        self.root.geometry(f"{width}x{heigth}")

        self.tabs_control = ttk.Notebook(self.root)
        self.tab1 = Frame(self.tabs_control)
        self.tabs_control.add(self.tab1, text='Основа')
        self.markSmax = Label(self.tab1, text='Smax')
        self.txtSmax = Entry(self.tab1, width=10)
        
        self.markCons = Label(self.tab1, text='Кол-во потребителей 3й категории, %')
        self.txtCons = Entry(self.tab1, width=10)
        self.markSelect = Label(self.tab1, text='Подбор трансформатора')
        
#        self.btnSelect = Button(self.tab1, text='Расчет', command=select())
#                                                                        ^^  <------------- ???
        self.btnSelect = Button(self.tab1, text='Расчет', command=self.select)            # +++

        self.text = StringVar()                                                           # +++
# ???         self.markSelect1 = Label(self.tab1, text=select())
        self.markSelect1 = Label(self.tab1, textvariable=self.text)                       # +++
        
# ???        s = self.txtSmax.get()
# ???        e = self.txtCons.get()

    def run(self):
        self.draw_widjets()
        self.root.mainloop()

    def draw_widjets(self):
        self.tabs_control.pack(fill=BOTH, expand=1)
        self.markSmax.grid(column=0, row=0, padx=5, pady=5)
        self.txtSmax.grid(column=0, row=1, padx=5, pady=5)
        self.markCons.grid(column=0, row=2, padx=5, pady=5)
        self.txtCons.grid(column=0, row=3, padx=5, pady=5)
        self.markSelect.grid(column=5, row=0, padx=5, pady=5)
        self.btnSelect.grid(column=5, row=1, padx=5, pady=5)
        self.markSelect1.grid(column=5, row=2, padx=5, pady=5)

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv        
    def select(self):
# ???        s = int()
# ???        e = int() / 100
        
        s = float(self.txtSmax.get())                                                    # +++
        e = float(self.txtCons.get())                                                    # +++
        
        list_tr = [10, 16, 25, 40]
        var_a = s * (1 - 0) / 1.4
        var_b = s * (1 - 0.5 * e) / 1.4
        var_c = s * (1 - e) / 1.4
        E = []
        
        #print(f'var_a = {var_a}; var_b = {var_b}; var_c = {var_c}; ') #
        
        for i in range(len(list_tr)):
            if list_tr[i] > var_a:
                E.append(list_tr[i])
                break
        for i in range(len(list_tr)):
            if list_tr[i] > var_b:
                E.append(list_tr[i])
                break
        for i in range(len(list_tr)):
            if list_tr[i] > var_c:
                E.append(list_tr[i])
                break
        for i in range(len(E)):
            if E[i] < 17:
                E[i] = 'ТДН-' + str(E[i]) + '000'
            else:
                E[i] = 'ТРДН-' + str(E[i]) + '000'
        
        self.text.set(' '.join(E))                                                      # +++
        
# ???        return ' '.join(E)
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


if __name__ == '__main__':
    window = Window(500, 200, 'Тепловой расчет')
    window.run()

введите сюда описание изображения

→ Ссылка
Автор решения: Александр Барташевский

Получилось, используя инициализированный экземпляр окна window = Window(). Функция select принимает параметры экземпляра и вставляет значения в экземпляр.

Насколько это решение правильное покажет время)))

from tkinter import *
from tkinter import ttk


def select():
    s = int(window.txtSmax.get())
    e = int(window.txtCons.get()) / 100
    list_tr = [10, 16, 25, 40]
    var_a = s * (1 - 0) / 1.4
    var_b = s * (1 - 0.5 * e) / 1.4
    var_c = s * (1 - e) / 1.4
    E = []
    for i in range(len(list_tr)):
        if list_tr[i] > var_a:
            E.append(list_tr[i])
            break
    for i in range(len(list_tr)):
        if list_tr[i] > var_b:
            E.append(list_tr[i])
            break
    for i in range(len(list_tr)):
        if list_tr[i] > var_c:
            E.append(list_tr[i])
            break
    for i in range(len(E)):
        if E[i] < 17:
            E[i] = 'ТДН-' + str(E[i]) + '000'
        else:
            E[i] = 'ТРДН-' + str(E[i]) + '000'
    window.text.set(' '.join(E))


class Window:

    def __init__(self):
        self.root = Tk()
        self.root.title('Тепловой расчет')
        self.root.geometry(f"{500}x{200}")

        self.tabs_control = ttk.Notebook(self.root)
        self.tab1 = Frame(self.tabs_control)
        self.tabs_control.add(self.tab1, text='Основа')
        self.markSmax = Label(self.tab1, text='Smax')
        self.txtSmax = Entry(self.tab1, width=10)
        self.markCons = Label(self.tab1, text='Кол-во потребителей 3й категории, %')
        self.txtCons = Entry(self.tab1, width=10)
        self.markSelect = Label(self.tab1, text='Подбор трансформатора')
        self.btnSelect = Button(self.tab1, text='Расчет', command=select)
        self.text = StringVar()
        self.markSelect1 = Label(self.tab1, textvariable=self.text)

    def draw_widjets(self):

        self.tabs_control.pack(fill=BOTH, expand=1)
        self.markSmax.grid(column=0, row=0, padx=5, pady=5)
        self.txtSmax.grid(column=0, row=1, padx=5, pady=5)
        self.markCons.grid(column=0, row=2, padx=5, pady=5)
        self.txtCons.grid(column=0, row=3, padx=5, pady=5)
        self.markSelect.grid(column=5, row=0, padx=5, pady=5)
        self.btnSelect.grid(column=5, row=1, padx=5, pady=5)
        self.markSelect1.grid(column=5, row=2, padx=5, pady=5)


if __name__ == '__main__':
    window = Window()
    window.draw_widjets()
    window.root.mainloop()
→ Ссылка