Как создать общий интерфейс для настройки различными функциями в Python и Tkinter - PullRequest
0 голосов
/ 27 октября 2019

Я пишу код 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)

-------------------------------------------------------------

Код работает так, как есть, но меня беспокоит то, как распространить его на множество различных корреляций. Общий интерфейс сделает эту задачу намного проще, а код будет намного короче.

Заранее благодарю всех вас за любые рекомендации, которые вы мне можете дать.

...