Передача данных из виджета в функцию
Подскажите, пожалуйста, как правильно организовать передачу данных между виджетами 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()
