Я пишу код Python / Tkinter для расчета многих различных термодинамических (PVT) свойств и параметров нефтепереработки. Я установил последовательные интерфейсы, чтобы направить проблему к определенным типам свойств, например, плотности масла. Пользователь начинает с широкой классификации корреляций (нефть, газ и вода), пока не доберется до конкретной корреляции, например, FVF нефти, корреляция Постоянного.
Поскольку существует большое количество корреляций для каждогоПараметр PVT (плотность масла, FVF масла и т. Д.), Я хотел бы иметь общий интерфейс, который требует определенных корреляций для ввода основных данных (температура, давление и т. Д.). Незначительные корректировки общего интерфейса потребуются для конкретных корреляций, поскольку они немного отличаются в требуемых входных данных.
Мой вопрос: как лучше всего решить эту проблему?
Очевидно, что фабричный дизайн - это возможное решение, но я не совсем уверен в этом. Я ничего не знаю об этом предмете, и прежде чем углубляться в это, я хотел бы получить некоторое заверение, что это путь.
Ниже я покажу часть своего кода, где я использую традиционные классы и функции для созданияинтерфейс для одной конкретной корреляции. Как видно, создание интерфейса является частью самой корреляционной функции, которая становится громоздкой, когда добавляются новые корреляции.
1.2 OIL FVF (Bo)
class OilFVF (): ""«Этот класс обеспечивает фактическую работу нефтяных корреляций FVF». «»
def __init__(self, master):
self.master = master
master.title('OIL FVF CORRELATIONS')
# 1.2.2 Standing (1947)
def Standing(self):
# calculations function
def standing_1947_fvf(rs):
# get input parameters
p = float(p_enter.get())
temp = float(temp_enter.get())
api = float(api_enter.get())
gammag = float(gammag_enter.get())
# go on to calculations
yg = 0.0009*temp - 0.0125*api
den = 18*(10**yg)
gor = gammag*((p/den)**1.204)
gor = ("%8.0f" % gor).strip()
print("Rs = ",gor)
# clear current muod entry
rs.delete(0, END)
# insert result into entry widget
rs.insert(0, gor)
# create new window
standing = Tk()
# correlation title label
title_label = Label(standing,
text="Standing (1947)",
fg = "light green",
bg = "dark green",
font=('arial', 14, 'bold'))
title_label.grid(row=0, columnspan=3)
# correlation functional expression
expression_label = Label(standing,
text="Rs = f(p,T,API,gammag)")
expression_label.grid(row=1, columnspan=3)
# pressure input
Label(standing, text="p =").grid(row=2,column=0)
p = DoubleVar() # default value = 0.0
p_enter = Entry(standing,
width=10,
textvariable=p)
p_enter.grid(row=2,column=1)
Label(standing, text="psi").grid(row=2, column=2)
# temperature input
Label(standing, text="T =").grid(row=3,column=0)
temp = DoubleVar() # default value = 0.0
temp_enter = Entry(standing,
width=10,
textvariable=temp)
temp_enter.grid(row=3,column=1)
Label(standing, text="F").grid(row=3, column=2)
# API input
Label(standing, text="API =").grid(row=4,column=0)
api = DoubleVar() # default value = 0.0
api_enter = Entry(standing,
width=10,
textvariable=api)
api_enter.grid(row=4,column=1)
Label(standing, text="-").grid(row=4, column=2)
# gas specific gravity input
Label(standing, text="gammag =").grid(row=5)
gammag = DoubleVar()
gammag_enter = Entry(standing,
width=10,
textvariable=gammag)
gammag_enter.grid(row=5,column=1)
Label(standing, text="-").grid(row=5, column=2)
# Result block
Label(standing, text="Rs =").grid(row=7)
rs = Entry(standing,width=10)
rs.grid(row=7,column=1)
Label(standing, text="scf/STB").grid(row=7, column=2)
# Calculate button
standing_button = Button(standing,
text="Calculate",
command=(lambda : standing_1947_fvf(rs)))
standing_button.grid(row=6,column=1)
-------------------------------------------------------------
Код работает так, как есть, но меня беспокоит то, как распространить его на множество различных корреляций. Общий интерфейс сделает эту задачу намного проще, а код будет намного короче.
Заранее благодарю всех вас за любые рекомендации, которые вы мне можете дать.