Dando continuidad a la temática de la interfaz procedo a compartir la interfaz gráfica de las correlaciones de la presión de burbuja. En este código se hace uso de Combobox, en la siguiente imagen se observa como es un Combobox.
Se
aprecia un Combobox
en su forma contraída.

En
esta segunda imagen se observa el Combobox
cuando ha sido desplegado.

Ahora se muestra el código del Combobox, este contiene muchos
atributos que ya se han revisado, por lo que en esta ocasión se hablará sólo de
los nuevos atributos.
Valores = ['Standing, M.B','Lasater.', 'Vázquez,
M.E. y Beggs, H.D.', 'Glaso, O.', 'Total', 'Al-Marhoun, M.', 'Dokla, M.E. y
Osman, M.E.', 'Petrosky, G.E. Jr. y Farshad, F.F.', 'Kartoatmodjo, T. y
Schmidt, Z.']
Variable = tk.StringVar()
Visor_correlaciones = ttk.Combobox(Novena_Ventana)
Visor_correlaciones.place(relx=0.01, rely=0.01,
relheight=0.11, relwidth=0.750, bordermode='ignore')
Visor_correlaciones.configure(takefocus="",state="readonly",textvariable
= Variable, justify = "center",values = Valores)
Visor_correlaciones.current(0)
Como se aprecia los atributos que han sido agregados son:
· takefocus="", determina si la ventana acepta el foco durante el recorrido del teclado.
·
state="readonly",
determina
el estado de la lista, en este caso solo se puede leer.
·
textvariable = Variable,
recibe
el contenido de la lista.
·
justify =
"center", justifica el texto, en esta ocasión se justifica al
centro del recuadro.
En seguida se
muestra el código completo.
import math as math
from tkinter import *
import tkinter as tk
from tkinter import ttk
import numpy as np
from tkinter import messagebox
Novena_Ventana = Tk()
Novena_Ventana.geometry("450x200")
Novena_Ventana.maxsize(450,200)
Novena_Ventana.minsize(450,200)
Novena_Ventana.title("Presión de burbuja")
Novena_Ventana.configure(background="gray80",highlightbackground="gray80",highlightcolor="black")
Valores = ['Standing, M.B','Lasater.', 'Vázquez, M.E. y
Beggs, H.D.', 'Glaso, O.', 'Total', 'Al-Marhoun, M.', 'Dokla, M.E. y Osman,
M.E.', 'Petrosky, G.E. Jr. y Farshad, F.F.', 'Kartoatmodjo, T. y Schmidt, Z.']
print(len(Valores))
Variable = tk.StringVar()
Visor_correlaciones = ttk.Combobox(Novena_Ventana)
Visor_correlaciones.place(relx=0.01, rely=0.01,
relheight=0.11, relwidth=0.750, bordermode='ignore')
Visor_correlaciones.configure(takefocus="",state="readonly",textvariable
= Variable, justify = "center",values = Valores)
Visor_correlaciones.current(0)
def Correlaciones_Pb(event):
try:
Presion_Separador
= float(Entrada_1.get()) #PSI
Temperatura_Separador
= float(Entrada_2.get()) #°F
Rsb
= float(Entrada_3.get()) #PCN/BN
API
= float(Entrada_4.get()) #°API
Yg
= float(Entrada_5.get())
T
= float(Entrada_6.get()) #°F
YN2
= float(Entrada_7.get()) # % molar
YCO2
= float(Entrada_8.get()) # % molar
YH2S
= float(Entrada_9.get()) # % molar
"""#GASTO
= 700
#ESTRANGULADOR
= 1/8
Rsb
= 675 #PCN/BN
Presion_Separador
= 100 #PSI
Temperatura_Separador
= 85 #°F
API
= 31 #°API
Yg
= 0.95
T
= 180 #°F
YCO2
= 20/100 # % molar
YH2S
= 10/100 # % molar
"""
if
Presion_Separador <= 0:
messagebox.showwarning("Advertencia!","La
Presión del separador es incorrecta")
elif
Temperatura_Separador <= 0:
messagebox.showwarning("Advertencia!","La
Temperatura del separador es incorrecta")
elif
Rsb <= 0:
messagebox.showwarning("Advertencia!","La
Razón gas-petróleo es incorrecta")
elif
API <= 0:
messagebox.showwarning("Advertencia!","La
Graveda del petroleo es incorrecta")
elif
Yg <= 0:
messagebox.showwarning("Advertencia!","La
Densidad especifica es incorrecta")
elif
T <= 0:
messagebox.showwarning("Advertencia!","La
Temperatura es incorrecta")
elif
YN2 <= 0:
messagebox.showwarning("Advertencia!","El
Porcentaje contenido de N2 es incorrecto")
elif
YCO2 <= 0:
messagebox.showwarning("Advertencia!","El
Porcentaje contenido de CO2 es incorrecto")
elif
YH2S <= 0:
messagebox.showwarning("Advertencia!","El
Porcentaje contenido de H2S es incorrecto")
else:
YCO2
= YCO2/100 # % molar
YH2S
= YH2S/100 # % molar
YN2
= YN2/100 # % molar
Yo
= 141.5/(API+131.5)
CN2
=
1+((-2.65*(10**-4)*API+5.5*(10**-3))*T+(0.031*API-0.8259))*YN2+((1.954*(10**-11)*API**4.699)*T+(0.027*API-2.366))*YN2
CCO2
= 1-693.8*YCO2*(T**-1.553)
CH2S
= 1-(0.9035+0.0015*API)*YH2S+0.019*(45-API)*(YH2S**2)
if
str(Variable.get()) == Valores[0]:
#
Standing, M.B
CCO2
= 1-693.8*YCO2*(T**-1.553)
CH2S
= 1-((0.9035+0.0015*API)*YH2S)+(0.019*(45-API)*(YH2S**2))
F
= ((Rsb/Yg)**0.83)*10**(0.00091*T-0.0125*API)
Pb
= 18.2*(F-1.4)
PbC1
= Pb*CCO2*CH2S
Salida_1.delete(0,tk.END);Salida_1.insert(tk.END,round(PbC1,4))
elif
str(Variable.get()) == Valores[1]:
#
Lasater.
if
API <= 40:
Mo
= 630-10*API
elif
API > 40:
Mo
= 73110*APi**-1.562
else:
pass
Yo
= 141.5/(API+131.5)
Ygg
= ((Rsb/379.3)/((Rsb/379.3)+((350*Yo)/Mo)))
if
Ygg <= 0.60:
G
= 0.679*np.exp(2.786*Ygg)-0.323
elif
Ygg >= 0.60:
G
= 8.26*(Ygg**3.56)+1.95
else:
pass
Pb
= G*((T+460)/Yg)
PbC2
= Pb*CCO2*CH2S
Salida_1.delete(0,tk.END);Salida_1.insert(tk.END,round(PbC2,4))
elif
str(Variable.get()) == Valores[2]:
#
Vázquez, M.E. y Beggs, H.D.
if
API <= 30:
C1
= 0.0362; C2 = 1.0937; C3 = 25.724
elif
API > 30:
C1
= 0.0178; C2 = 1.1870; C3 = 23.931
else:
pass
Ygc
=
Yg*(1+5.912*(10**-5)*API*Temperatura_Separador*np.log(Presion_Separador/114.7))
Pb
= (Rsb/(C1*Ygc*np.exp((C3*API)/(T+460))))**(1/C2)
PbC3
= Pb*CCO2*CH2S
Salida_1.delete(0,tk.END);Salida_1.insert(tk.END,round(PbC3,4))
elif
str(Variable.get()) == Valores[3]:
#
Glaso, O.
F
= ((Rsb/Yg)**0.816)*((T**0.172)/(API**0.989))
Pb
= 10**(1.7669+1.7447*np.log10(F)-0.30218*(np.log10(F)**2))
PbC4
= Pb*CCO2*CH2S
Salida_1.delete(0,tk.END);Salida_1.insert(tk.END,round(PbC4,4))
elif str(Variable.get())
== Valores[4]:
#
Total
if
API <= 10:
C1
= 12.847 ; C2 = 0.9636 ; C3 = 0.000993 ; C4 = 0.034170
elif
10 < API and API <= 35:
C1
= 25.2755 ; C2 = 0.7617 ; C3 = 0.000835 ; C4 = 0.011292
elif
35 < API and API <= 45:
C1
= 216.4711 ; C2 = 0.6922 ; C3 = -0.000427 ; C4 = 0.023140
else:
pass
Pb
= C1*((Rsb/Yg)**C2)*(10**(C3*T-C4*API))
PbC5
= Pb*CCO2*CH2S
Salida_1.delete(0,tk.END);Salida_1.insert(tk.END,round(PbC5,4))
elif
str(Variable.get()) == Valores[5]:
#
Al-Marhoun, M.
Pb
=
(5.38088*(10**-3))*(Rsb**0.715082)*(Yg**-1.87784)*(Yo**3.1437)*((T+460)**1.32657)
PbC6
= Pb*CCO2*CH2S
Salida_1.delete(0,tk.END);Salida_1.insert(tk.END,round(PbC6,4))
elif
str(Variable.get()) == Valores[6]:
#
Dokla, M.E. y Osman, M.E.
Pb
=
0.836386*(10**4)*(Rsb**0.724047)*(Yg**-1.01049)*(Yo**0.107991)*((T+460)**-0.952584)
PbC7
= Pb*CCO2*CH2S
Salida_1.delete(0,tk.END);Salida_1.insert(tk.END,round(PbC7,4))
elif
str(Variable.get()) == Valores[7]:
#
Petrosky, G.E. Jr. y Farshad, F.F.
F
=
((Rsb**0.5774)/(Yg**0.8439))*(10**(4.561*(10**-5)*(T**1.3911)-7.916*(10**-4)*(API**1.541)))
Pb
= 112.727*(F-12.34)
PbC8
= Pb*CCO2*CH2S
Salida_1.delete(0,tk.END);Salida_1.insert(tk.END,round(PbC8,4))
elif
str(Variable.get()) == Valores[8]:
#
Kartoatmodjo, T. y Schmidt, Z.
if
API <= 30:
C1
= 0.05958; C2 = 0.7972; C3 = 13.1405; C4 = 0.9986
elif
API > 30:
C1
= 0.03150; C2 = 0.7587; C3 = 11.2895; C4 = 0.9143
else:
pass
Ygc
=
Yg*(1+(5.912*10**-5)*API*Temperatura_Separador*np.log10(Presion_Separador/114.7))
Pb
= (Rsb/(C1*(Ygc**C2)*(10**((C3*API)/(T+460)))))**C4
PbC9
= Pb*CCO2*CH2S
Salida_1.delete(0,tk.END);Salida_1.insert(tk.END,round(PbC9,4))
else:
messagebox.showwarning("Advertencia!","La
opción seleccionada rompio la realidad")
except
ZeroDivisionError:
messagebox.showwarning("Advertencia!","Los
datos ingresados son incorrectos, por favor revisalos")
except
SyntaxError:
messagebox.showwarning("Advertencia!","Los
datos ingresados son incorrectos, por favor revisalos")
except
ValueError:
messagebox.showwarning("Advertencia!","Los
datos ingresados son incorrectos, por favor revisalos")
finally:
pass
return
Visor_correlaciones.bind('<<ComboboxSelected>>',
Correlaciones_Pb)
Recuadro_Entradas = tk.LabelFrame(Novena_Ventana)
Recuadro_Entradas.place(relx=0.01, rely=0.13, relheight=0.850,
relwidth=0.980)
Recuadro_Entradas.configure(relief='groove',foreground="black",text='''Entradas''',background="gray80",highlightbackground="gray80",highlightcolor="black",width=330)
Mensaje_1 = tk.Message(Recuadro_Entradas)
Mensaje_1.place(relx=0.02, rely=0.01, height=25, width=80)
Mensaje_1.configure(background="gray80",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",justify='center',text='''PS''')
Mensaje_2 = tk.Message(Recuadro_Entradas)
Mensaje_2.place(relx=0.02, rely=0.30, height=25, width=80)
Mensaje_2.configure(background="gray80",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",justify='center',text='''TS''')
Mensaje_3 = tk.Message(Recuadro_Entradas)
Mensaje_3.place(relx=0.21, rely=0.01, height=25, width=80)
Mensaje_3.configure(background="gray80",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",justify='center',text='''Rsb''')
Mensaje_4 = tk.Message(Recuadro_Entradas)
Mensaje_4.place(relx=0.21, rely=0.30, height=25, width=80)
Mensaje_4.configure(background="gray80",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",justify='center',text='''°API''')
Mensaje_5 = tk.Message(Recuadro_Entradas)
Mensaje_5.place(relx=0.40, rely=0.00, height=25, width=80)
Mensaje_5.configure(background="gray80",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",justify='center',text='''Yg''')
Mensaje_6 = tk.Message(Recuadro_Entradas)
Mensaje_6.place(relx=0.40, rely=0.30, height=25, width=80)
Mensaje_6.configure(background="gray80",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",justify='center',text='''T''')
Mensaje_7 = tk.Message(Recuadro_Entradas)
Mensaje_7.place(relx=0.60, rely=0.00, height=25, width=80)
Mensaje_7.configure(background="gray80",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",justify='center',text='''YN2''')
Mensaje_8 = tk.Message(Recuadro_Entradas)
Mensaje_8.place(relx=0.60, rely=0.30, height=25, width=80)
Mensaje_8.configure(background="gray80",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",justify='center',text='''YCO''')
Mensaje_9 = tk.Message(Recuadro_Entradas)
Mensaje_9.place(relx=0.80, rely=0.00, height=25, width=80)
Mensaje_9.configure(background="gray80",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",justify='center',text='''YH2S''')
Mensaje_10 = tk.Label(Recuadro_Entradas)
Mensaje_10.place(relx=0.21, rely=0.62, height=25, width=140)
Mensaje_10.configure(background="gray80",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",justify='center',text='''Resultado:''')
Entrada_1 = tk.Entry(Recuadro_Entradas)
Entrada_1.place(relx=0.02, rely=0.18, height=20, width=80)
Entrada_1.configure(background="white",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",justify='center')
Entrada_2 = tk.Entry(Recuadro_Entradas)
Entrada_2.place(relx=0.02, rely=0.46, height=20, width=80)
Entrada_2.configure(background="white",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",justify='center')
Entrada_3 = tk.Entry(Recuadro_Entradas)
Entrada_3.place(relx=0.21, rely=0.18, height=20, width=80)
Entrada_3.configure(background="white",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",justify='center')
Entrada_4 = tk.Entry(Recuadro_Entradas)
Entrada_4.place(relx=0.21, rely=0.46, height=20, width=80)
Entrada_4.configure(background="white",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",justify='center')
Entrada_5 = tk.Entry(Recuadro_Entradas)
Entrada_5.place(relx=0.40, rely=0.18, height=20, width=80)
Entrada_5.configure(background="white",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",justify='center')
Entrada_6 = tk.Entry(Recuadro_Entradas)
Entrada_6.place(relx=0.40, rely=0.46, height=20, width=80)
Entrada_6.configure(background="white",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",justify='center')
Entrada_7 = tk.Entry(Recuadro_Entradas)
Entrada_7.place(relx=0.60, rely=0.18, height=20, width=80)
Entrada_7.configure(background="white",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",justify='center')
Entrada_8 = tk.Entry(Recuadro_Entradas)
Entrada_8.place(relx=0.60, rely=0.46, height=20, width=80)
Entrada_8.configure(background="white",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",justify='center')
Entrada_9 = tk.Entry(Recuadro_Entradas)
Entrada_9.place(relx=0.80, rely=0.18, height=20, width=80)
Entrada_9.configure(background="white",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",justify='center')
Salida_1 = tk.Entry(Recuadro_Entradas)
Salida_1.place(relx=0.50, rely=0.64, height=20, width=140)
Salida_1.configure(background="white",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",justify='center')
Entrada_1.delete(0,tk.END);Entrada_1.insert(tk.END,"");Entrada_1.insert(tk.END,0.00)
Entrada_2.delete(0,tk.END);Entrada_2.insert(tk.END,"");Entrada_2.insert(tk.END,0.00)
Entrada_3.delete(0,tk.END);Entrada_3.insert(tk.END,"");Entrada_3.insert(tk.END,0.00)
Entrada_4.delete(0,tk.END);Entrada_4.insert(tk.END,"");Entrada_4.insert(tk.END,0.00)
Entrada_5.delete(0,tk.END);Entrada_5.insert(tk.END,"");Entrada_5.insert(tk.END,0.00)
Entrada_6.delete(0,tk.END);Entrada_6.insert(tk.END,"");Entrada_6.insert(tk.END,0.00)
Entrada_7.delete(0,tk.END);Entrada_7.insert(tk.END,"");Entrada_7.insert(tk.END,0.00)
Entrada_8.delete(0,tk.END);Entrada_8.insert(tk.END,"");Entrada_8.insert(tk.END,0.00)
Entrada_9.delete(0,tk.END);Entrada_9.insert(tk.END,"");Entrada_9.insert(tk.END,0.00)
Salida_1.delete(0,tk.END);Salida_1.insert(tk.END,"");Salida_1.insert(tk.END,0.00)
def Limpiando():
Entrada_1.delete(0,tk.END);Entrada_1.insert(tk.END,"");Entrada_1.insert(tk.END,0.00)
Entrada_2.delete(0,tk.END);Entrada_2.insert(tk.END,"");Entrada_2.insert(tk.END,0.00)
Entrada_3.delete(0,tk.END);Entrada_3.insert(tk.END,"");Entrada_3.insert(tk.END,0.00)
Entrada_4.delete(0,tk.END);Entrada_4.insert(tk.END,"");Entrada_4.insert(tk.END,0.00)
Entrada_5.delete(0,tk.END);Entrada_5.insert(tk.END,"");Entrada_5.insert(tk.END,0.00)
Entrada_6.delete(0,tk.END);Entrada_6.insert(tk.END,"");Entrada_6.insert(tk.END,0.00)
Entrada_7.delete(0,tk.END);Entrada_7.insert(tk.END,"");Entrada_7.insert(tk.END,0.00)
Entrada_8.delete(0,tk.END);Entrada_8.insert(tk.END,"");Entrada_8.insert(tk.END,0.00)
Entrada_9.delete(0,tk.END);Entrada_9.insert(tk.END,"");Entrada_9.insert(tk.END,0.00)
Salida_1.delete(0,tk.END);Salida_1.insert(tk.END,"");Salida_1.insert(tk.END,0.00)
return
Limpieza =
Button(Recuadro_Entradas,activebackground="OliveDrab4",activeforeground="black",background="gray80",disabledforeground="#a3a3a3",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",pady="0",text='''Limpieza''',
command = Limpiando).place(relx = 0.23, rely = 0.80, height=25, width=217)
Novena_Ventana.mainloop()
El código devuelve lo siguiente: