Форум сайта python.su
0
PEHDOMДа вы все правильно поняли, но сложность в том, что в этой функции обращения к этим переменным происходят постоянно в том числе циклы, т.е. переменный необходимо поименовать именами которые задаются при создании объекта (т.к. заранее неизвестно сколько полей ввода будет, поэтому как то стандартизировать это не получается видимо) и присвоить им значения из полей ввода и потом уже не зависимо от объекта класса работать с ними в вызванной функции. Окна планируются такие как есть сейчас, меняется только количество полей, подписи к полям, значения и тип значений в полях, имена переменных в которые потом будем эти поля присваивать. Можно даже рассмотреть вариант, что мы знаем заранее количество полей и их порядок, но в вызываемой функции нам надо задать имена переменным такие как мы хотим, в идеале конечно передать имена через объект класса.
Отредактировано winmasta (Ноя. 21, 2017 14:30:08)
Офлайн
294
честно говоря не пойму зачем это? Если это тупо перемножить\сложить все аргументы то какая вам разница как назывются переменные?, а если это чтото типа (a+b-(c /d))*e то вам всеравно придеться писать под каждую формулу отдельную функцию. В чем проблема? Создайте функцию с аргументами (a,b,c,d,e) передавайте в окно название полей ‘a’,'b','c','d','e' оно вызовет каллбек функцию с аргументами в том же порядке, зачем вам знать как эти переменные назывались в окне или гдето еще?
или я чегото не понимаю, может вы приведете какойто мнимальный запускаемый код который демонстрирует ваш полет мысли для боьшего понимания?
[code python][/code]
Офлайн
0
#!/usr/bin/python3 # coding=utf8 import tkinter from tkinter import * from math import factorial from matplotlib import pyplot as plt import numpy as np from scipy.interpolate import spline # Функция рассчитывает p0 def calc_p0(s, m, ro): p0 = 0 for i in range(0, s): p0 += (ro ** i) / factorial(i) p0 = 1 / (p0 + (ro ** (s + 1)) / (factorial(s) * s) * ((1 - ((ro / s) ** m)) / (1 - (ro / s)))) return p0 # Функция рассчитывает вероятность занятости k печей def calc_p_k(k, s, ro): p0 = calc_p0(s, (s - k), ro) if k <= s: p_k = (p0 * (ro ** k)) / factorial(k) else: p_k = (p0 * (ro ** k)) / (factorial(s) * (s ** (k - s))) return p_k # Функция рассчитывает среднее число свободных печей def calc_m2(k, s, ro): m2 = 0 p0 = calc_p0(s, (s - k), ro) for i in range(0, s): m2 += ((s - i) * (ro ** i) * p0) / factorial(i) return m2 # Функция рассчитывает совокупные затраты порта при заданных значениях def calc_cost(lmbd, m, ro, e, c1, c2, c3, c4, c5, t, s, k): p0 = calc_p0(s, m, ro) avg_queue = p0 * ((ro**(s+1)) / (s * factorial(s))) * ((1-((ro/s)**m) * (m + 1 - m * (ro/s))) / ((1-(ro/s))**2)) m1 = avg_queue m2 = calc_m2(k, s, ro) p_k = calc_p_k(k, s, ro) cost = e * c1 * k + c2 * (s - m2) * t + c3 * m2 * t + c5 * t * lmbd * p_k + c4 * m1 * t return cost def calculate(lmbd, mu, e, c1, c2, c3, c4, c5, t, s, smooth): lmbd = lmbd.get() mu = mu.get() e = e.get() c1 = c1.get() c2 = c2.get() c3 = c3.get() c4 = c4.get() c5 = c5.get() t = t.get() s = s.get() # Считаем приведенную интенсивность (ро) ro = lmbd / mu cost_arr = [] x_axis = [] for i in range(1, s): m = s - i cost = calc_cost(lmbd, m, ro, e, c1, c2, c3, c4, c5, t, s, i) x_axis.append(i) cost_arr.append(cost) # Вычисляем оптимальное количество печей - индекс в массиве стоимостей с наименьшим членом массива opt_furnace_num = cost_arr.index(min(cost_arr)) + 1 # Строим график зависимости затрат порта от количества причалов при заданных значениях plt.subplots(num="График №1", figsize=(10, 10), dpi=80) plt.title("Зависимость затрат от соотношения назначения печей") xnew = np.linspace(min(x_axis), max(x_axis), (len(x_axis) * 100)) y_smooth = spline(x_axis, cost_arr, xnew) y_axis = cost_arr if smooth.get() == 1: x_axis = xnew y_axis = y_smooth line_red, = plt.plot(x_axis, y_axis, "r--", lw=1, linestyle="-", label="затраты, руб") plt.legend(handles=[line_red]) window = Tk() window.geometry("300x50") window.title("Результаты рассчетов") text = "Оптимальное количество печей:" w = Message(window, text=text, width=500) w.config(font=("times", 14)) w.grid(row=0, column=0, sticky="w") text = round(opt_furnace_num) w = Message(window, text=text, width=500) w.config(font=("times", 14, "bold")) w.grid(row=0, column=1, sticky="w" + "e") plt.show() # Создаем окно для ввода данных root = Tk() root.title("Лабораторная работа № 6. ТМО.") input_intensity = DoubleVar() input_intensity.set(10) input_intensity_label = Label(text="Интенсивность прихода слитокв (шт/сут):") input_intensity_label.grid(sticky="w") input_intensity_entry = Entry(textvariable=input_intensity) input_intensity_entry.grid(row=0, column=1) output_intensity = DoubleVar() output_intensity.set(2) output_intensity_label = Label(text="Интенсивность нагрева слитков перед ковкой (шт/сут):") output_intensity_label.grid(sticky="w") output_intensity_entry = Entry(textvariable=output_intensity) output_intensity_entry.grid(row=1, column=1) capital_efficiency_ratio = DoubleVar() capital_efficiency_ratio.set(0.15) capital_efficiency_ratio_label = Label(text="Коэффициент эффективности капитоловложений (руб/год):") capital_efficiency_ratio_label.grid(sticky="w") capital_efficiency_ratio_entry = Entry(textvariable=capital_efficiency_ratio) capital_efficiency_ratio_entry.grid(row=2, column=1) furnace_cost = DoubleVar() furnace_cost.set(100000) furnace_cost_label = Label(text="Цена одной печи (руб):") furnace_cost_label.grid(sticky="w") furnace_cost_entry = Entry(textvariable=furnace_cost) furnace_cost_entry.grid(row=3, column=1) furnace_keep_cost = DoubleVar() furnace_keep_cost.set(50) furnace_keep_cost_label = Label(text="Цена содержания одной печи (руб):") furnace_keep_cost_label.grid(sticky="w") furnace_keep_cost_entry = Entry(textvariable=furnace_keep_cost) furnace_keep_cost_entry.grid(row=4, column=1) furnace_keep_downtime_cost = DoubleVar() furnace_keep_downtime_cost.set(30) furnace_keep_downtime_cost_label = Label(text="Цена содержания одной печи в простое (руб):") furnace_keep_downtime_cost_label.grid(sticky="w") furnace_keep_downtime_cost_entry = Entry(textvariable=furnace_keep_downtime_cost) furnace_keep_downtime_cost_entry.grid(row=5, column=1) queue_cost = DoubleVar() queue_cost.set(60) queue_cost_label = Label(text="Затраты на содержание слитка в копильнике (руб/сут):") queue_cost_label.grid(sticky="w") queue_cost_entry = Entry(textvariable=queue_cost) queue_cost_entry.grid(row=6, column=1) heat_cost = DoubleVar() heat_cost.set(1600) heat_cost_label = Label(text="Затраты на разогрев отосланных на склад слитков (руб/сут):") heat_cost_label.grid(sticky="w") heat_cost_entry = Entry(textvariable=heat_cost) heat_cost_entry.grid(row=7, column=1) year_worktime_fund = DoubleVar() year_worktime_fund.set(365) year_worktime_fund_label = Label(text="Годовой фонд рабочего врмени (сут):") year_worktime_fund_label.grid(sticky="w") year_worktime_fund_entry = Entry(textvariable=year_worktime_fund) year_worktime_fund_entry.grid(row=8, column=1) furnace_max = IntVar() furnace_max.set(10) furnace_max_label = Label(text="Максимальное количество печей (шт):") furnace_max_label.grid(sticky="w") furnace_max_entry = Entry(textvariable=furnace_max) furnace_max_entry.grid(row=9, column=1) image = PhotoImage(file="tusur3_100x100.png") label = Label(image=image) label.image = image label.grid(row=0, column=2, columnspan=2, rowspan=10, sticky="w" + "e" + "n" + "s", padx=5, pady=5) smooth_flag = IntVar() smooth_flag.set(1) check_button = Checkbutton(text="Сглаживание графиков", variable=smooth_flag, onvalue=1, offvalue=0) check_button.grid(row=11, column=0, sticky="w") message_button = Button(text="Рассчитать", command=lambda: calculate(input_intensity, output_intensity, capital_efficiency_ratio, furnace_cost, furnace_keep_cost, furnace_keep_downtime_cost, queue_cost, heat_cost, year_worktime_fund, furnace_max, smooth_flag)) message_button.grid(row=11, column=2, padx=5, pady=5, sticky="e") ico = tkinter.Image("photo", file="tusur2.png") root.iconphoto(root, ico) root.mainloop()
Отредактировано winmasta (Ноя. 22, 2017 13:17:57)
Офлайн
73
winmastaтак и есть. сколько полей вы подадите в gui_var_lmbd столько их вам и нарисует
Вот проблема в том, что хочется построить конструктор для любого количества полей ввода,
Отредактировано marvellik (Ноя. 22, 2017 18:45:37)
Офлайн
0
marvellikЭто только полдела, вторая половина - объявить эти переменные (желательно именами заданными при создании объекта) в вызываемой функции и работать с ними.
Отредактировано winmasta (Ноя. 23, 2017 08:27:53)
Офлайн
294
winmastaя в принципе не понимаю что вы хотите, в какой функции вы хотите обьявлять переменные заданые при создании какого обьекта? и зачем вам это??
вторая половина - объявить эти переменные (желательно именами заданными при создании объекта) в вызываемой функции и работать с ними.
[code python][/code]
Офлайн
0
PEHDOM
def calculate(lmbd, mu, e, c1, c2, c3, c4, c5, t, s, smooth): lmbd = lmbd.get() mu = mu.get() e = e.get() c1 = c1.get() c2 = c2.get() c3 = c3.get() c4 = c4.get() c5 = c5.get() t = t.get() s = s.get()
cost = calc_cost(lmbd, m, ro, e, c1, c2, c3, c4, c5, t, s, i)
d = a + b e = d - c print(a, b, c, d, e)
Отредактировано winmasta (Ноя. 25, 2017 13:24:06)
Офлайн
568
winmasta
По сути основной вопрос, который возник с самого начала звучит так:
можно ли передав в функцию словарь вида {a: 1, b: 2, c: 3} объявить переменные a, b и с не зная заранее имен ключей (т.е. задавая имя переменной = имя ключа словаря) ну и далее работать с ними в функции как с обычными переменными ? Например::
Офлайн
73
FishHookвы сами себя загоняете в тупик.
По сути основной вопрос, который возник с самого начала звучит так:
можно ли передав в функцию словарь вида {a: 1, b: 2, c: 3} объявить переменные a, b и с не зная заранее имен ключей (т.е. задавая имя переменной = имя ключа словаря)
Офлайн
0
Всем спасибо большое за помощь, теперь все ясно )
Офлайн