miércoles, 30 de marzo de 2022

Continuación Tkinter Python

Dando continuidad a la entrada anterior se traen dos ejemplos, el primer ejemplo imprime la frase “Hola, Mundo”, además cuenta con un botón que borra el mensaje y el segundo ejemplo es una calculadora.

 En este primer ejemplo no se agregan nuevos ítems.
 
Tercera_Ventana = Tk()
Tercera_Ventana.geometry("300x400")
Tercera_Ventana.maxsize(300,400)
Tercera_Ventana.minsize(300,400)
Tercera_Ventana.title("Tercera Ventana")
Tercera_Ventana.configure(background="gold", highlightbackground="gold", highlightcolor="black")
 
def Impresion():
 
            Mensaje = tk.Message(Tercera_Ventana)
            Mensaje.place(relx=0.25, rely=0.55, height=44, width=157)
            Mensaje.configure(background="white", foreground="#000000", highlightbackground="#d9d9d9", highlightcolor="black", justify='center', text='''Hola,  Mundo''')
 
            return
 
def Limpieza():
 
            Mensaje = tk.Message(Tercera_Ventana)
            Mensaje.place(relx=0.25, rely=0.55, height=44, width=157)
            Mensaje.configure(background="white", foreground="#000000", highlightbackground="#d9d9d9", highlightcolor="black", justify='center', text=''' ''')
 
            return
 
Boton_Impresion = Button(Tercera_Ventana, activebackground="#ececec", activeforeground="#000000", background="#d9d9d9", disabledforeground="#a3a3a3", foreground="#000000", highlightbackground="#d9d9d9", highlightcolor="black", pady="0", text='''Imprimir''', command = Impresion).place(relx=0.25, rely=0.35, height=44, width=157)
 
Boton_Limpieza = Button(Tercera_Ventana, activebackground="#ececec", activeforeground="#000000", background="#d9d9d9", disabledforeground="#a3a3a3", foreground="#000000", highlightbackground="#d9d9d9", highlightcolor="black", pady="0", text='''Limpieza''', command = Limpieza).place(relx=0.25, rely=0.75, height=44, width=157)
 
Mensaje = tk.Message(Tercera_Ventana)
Mensaje.place(relx=0.25, rely=0.55, height=44, width=157)
Mensaje.configure(background="white", foreground="#000000", highlightbackground="#d9d9d9", highlightcolor="black", justify='center', text=''' ''')
 
Tercera_Ventana.mainloop()
 
Al ejecutar el código genera la siguiente interfaz.
 
  
 
El siguiente ejemplo es una calculadora, en este nuevo código se agregan las siguientes líneas:
 
Las siguientes líneas son parecidas al código del botón y del mensaje, se da el nombre a la entrada, el lugar en el que se ubicará y la configuración que tendrá.
 
Entrada = tk.Entry(Cuarta_Ventana)
Entrada.place(relx=0.04, rely=0.05, height=40, width=265)
Entrada.configure(background="white",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",justify='right',text=''' ''')
 

Las siguientes líneas utilizan las funciones delete e incert, la primera función elimina todo carácter que haya en la entrada, en este caso comienza desde la posición cero hasta el final, la segunda función inserta un espacio vacío en la entrada desde el final.  
 
Entrada.delete(0,tk.END)
Entrada.insert(tk.END,"")
 
Ahora en las siguientes líneas se tiene lo que se conoce como try, este método ayuda a saltar errores lógicos que pudieran ocurrir en el código, está compuesto por try, except y finally. En try se coloca el código que puede generar el error, en except se coloca el código que la computadora debe ejecutar en caso que el error se haga presente, hay que aclarar que hay diferentes tipos de errores algunos de ellos son: SyntaxError, TypeError, NameError, etc. Por último se encuentra finally, este se ejecutara después de haber recorrido try o except.
 
            try:
 
                        Op = Entrada.get()
                        Resutlado = eval(Op)
 
                        Entrada.delete(0,tk.END)
                        Entrada.insert(tk.END,"")
 
                        Entrada.insert(tk.END,Resutlado)
 
            except SyntaxError:
 
                        print("Introduce el número faltante")
 
            finally:
 
                        pass
 
            return

En la siguiente función se ingresan  los dígitos y los operadores con los cuales se construyen las operaciones que se desean calcular.
 
i = 0
 
def Click(Objeto):
 
            global i
 
            Entrada.insert(i,Objeto)
            i += 1
 
            return
 
En la función Operacion se lleva a cabo el cálculo de la operación introducida por el usuario, esto se realiza mediante la función eval una vez que se obtiene el resultado se devuelve al usuario mediante la Entrada.
 
def Operacion():
 
            try:
 
                        Op = Entrada.get()
                        Resutlado = eval(Op)
 
                        Entrada.delete(0,tk.END)
                        Entrada.insert(tk.END,"")
 
                        Entrada.insert(tk.END,Resutlado)
 
            except SyntaxError:
 
                        print("Introduce el número faltante")
 
            finally:
 
                        pass
 
            return
 
Por último se encuentra la función Limpieza la cual limpia la Entrada.
 
def Limpieza():
 
            Entrada.delete(0,tk.END)
            Entrada.insert(tk.END,"")
 
            return
 
El código completo se muestra a continuación:
 
Cuarta_Ventana = Tk()
Cuarta_Ventana.geometry("290x200")
Cuarta_Ventana.maxsize(290,200)
Cuarta_Ventana.minsize(290,200)
Cuarta_Ventana.title("Calculardora 1")
Cuarta_Ventana.configure(background="green2",highlightbackground="green2",highlightcolor="black")
 
Entrada = tk.Entry(Cuarta_Ventana)
Entrada.place(relx=0.04, rely=0.05, height=40, width=265)
Entrada.configure(background="white",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",justify='right',text=''' ''')
 
Entrada.delete(0,tk.END)
Entrada.insert(tk.END,"")
 
i = 0
 
def Click(Objeto):
 
            global i
 
            Entrada.insert(i,Objeto)
            i += 1
 
            return
 
def Operacion():
 
            try:
 
                        Op = Entrada.get()
                        Resutlado = eval(Op)
 
                        Entrada.delete(0,tk.END)
                        Entrada.insert(tk.END,"")
 
                        Entrada.insert(tk.END,Resutlado)
 
            except SyntaxError:
 
                        print("Introduce el número faltante")
 
            finally:
 
                        pass
 
            return
 
def Limpieza():
 
            Entrada.delete(0,tk.END)
            Entrada.insert(tk.END,"")
 
            return
 
# Numeros
 
Boton_1_ = Button(Cuarta_Ventana,activebackground="orange",activeforeground="#000000",background="yellow",disabledforeground="#a3a3a3",foreground="#000000",highlightbackground="yellow",highlightcolor="black",pady="0",text='''1''',command = lambda: Click(1)).place(relx=0.06, rely=0.30, height=40, width=40)
Boton_2_ = Button(Cuarta_Ventana,activebackground="orange",activeforeground="#000000",background="yellow",disabledforeground="#a3a3a3",foreground="#000000",highlightbackground="yellow",highlightcolor="black",pady="0",text='''2''',command = lambda: Click(2)).place(relx=0.21, rely=0.30, height=40, width=40)
Boton_3_ = Button(Cuarta_Ventana,activebackground="orange",activeforeground="#000000",background="yellow",disabledforeground="#a3a3a3",foreground="#000000",highlightbackground="yellow",highlightcolor="black",pady="0",text='''3''',command = lambda: Click(3)).place(relx=0.36, rely=0.30, height=40, width=40)
 
Boton_4_ = Button(Cuarta_Ventana,activebackground="orange",activeforeground="#000000",background="yellow",disabledforeground="#a3a3a3",foreground="#000000",highlightbackground="yellow",highlightcolor="black",pady="0",text='''4''',command = lambda: Click(4)).place(relx=0.06, rely=0.52, height=40, width=40)
Boton_5_ = Button(Cuarta_Ventana,activebackground="orange",activeforeground="#000000",background="yellow",disabledforeground="#a3a3a3",foreground="#000000",highlightbackground="yellow",highlightcolor="black",pady="0",text='''5''',command = lambda: Click(5)).place(relx=0.21, rely=0.52, height=40, width=40)
Boton_6_ = Button(Cuarta_Ventana,activebackground="orange",activeforeground="#000000",background="yellow",disabledforeground="#a3a3a3",foreground="#000000",highlightbackground="yellow",highlightcolor="black",pady="0",text='''6''',command = lambda: Click(6)).place(relx=0.36, rely=0.52, height=40, width=40)
 
Boton_7_ = Button(Cuarta_Ventana,activebackground="orange",activeforeground="#000000",background="yellow",disabledforeground="#a3a3a3",foreground="#000000",highlightbackground="yellow",highlightcolor="black",pady="0",text='''7''',command = lambda: Click(7)).place(relx=0.06, rely=0.74, height=40, width=40)
Boton_8_ = Button(Cuarta_Ventana,activebackground="orange",activeforeground="#000000",background="yellow",disabledforeground="#a3a3a3",foreground="#000000",highlightbackground="yellow",highlightcolor="black",pady="0",text='''8''',command = lambda: Click(8)).place(relx=0.21, rely=0.74, height=40, width=40)
Boton_9_ = Button(Cuarta_Ventana,activebackground="orange",activeforeground="#000000",background="yellow",disabledforeground="#a3a3a3",foreground="#000000",highlightbackground="yellow",highlightcolor="black",pady="0",text='''9''',command = lambda: Click(9)).place(relx=0.36, rely=0.74, height=40, width=40)
 
Boton_0_ = Button(Cuarta_Ventana,activebackground="orange",activeforeground="#000000",background="yellow",disabledforeground="#a3a3a3",foreground="#000000",highlightbackground="yellow",highlightcolor="black",pady="0",text='''0''',command = lambda: Click(0)).place(relx=0.51, rely=0.74, height=40, width=40)
 
# Operaciones
 
 
Boton_suma_ = Button(Cuarta_Ventana,activebackground="pink",activeforeground="#000000",background="salmon",disabledforeground="#a3a3a3",foreground="#000000",highlightbackground="salmon",highlightcolor="black",pady="0",text='''+''', command =lambda: Click("+")).place(relx=0.51, rely=0.30, height=40, width=40)
Boton_resta_ = Button(Cuarta_Ventana,activebackground="pink",activeforeground="#000000",background="salmon",disabledforeground="#a3a3a3",foreground="#000000",highlightbackground="salmon",highlightcolor="black",pady="0",text='''-''', command =lambda: Click("-")).place(relx=0.51, rely=0.52, height=40, width=40)
Boton_multi_ = Button(Cuarta_Ventana,activebackground="pink",activeforeground="#000000",background="salmon",disabledforeground="#a3a3a3",foreground="#000000",highlightbackground="salmon",highlightcolor="black",pady="0",text='''*''', command =lambda: Click("*")).place(relx=0.66, rely=0.30, height=40, width=40)
Boton_divic_ = Button(Cuarta_Ventana,activebackground="#ece",activeforeground="#000000",background="salmon",disabledforeground="#a3a3a3",foreground="#000000",highlightbackground="salmon",highlightcolor="black",pady="0",text='''/''', command =lambda: Click("/")).place(relx=0.66, rely=0.52, height=40, width=40)
 
Boton_C_ = Button(Cuarta_Ventana,activebackground="pink",activeforeground="#000000",background="salmon",disabledforeground="#a3a3a3",foreground="#000000",highlightbackground="salmon",highlightcolor="black",pady="0",text='''C''', command =Limpieza).place(relx=0.66, rely=0.74, height=40, width=40)
Boton_1_ = Button(Cuarta_Ventana,activebackground="pink",activeforeground="#000000",background="salmon",disabledforeground="#a3a3a3",foreground="#000000",highlightbackground="salmon",highlightcolor="black",pady="0",text='''(''', command = lambda : Click("(")).place(relx=0.81, rely=0.52, height=40, width=40)
Boton_2_ = Button(Cuarta_Ventana,activebackground="pink",activeforeground="#000000",background="salmon",disabledforeground="#a3a3a3",foreground="#000000",highlightbackground="salmon",highlightcolor="black",pady="0",text=''')''', command = lambda : Click(")")).place(relx=0.81, rely=0.30, height=40, width=40)
 
Boton_igual_ = Button(Cuarta_Ventana,activebackground="#ececec",activeforeground="#000000",background="DodgerBlue2",disabledforeground="#a3a3a3",foreground="#000000",highlightbackground="DodgerBlue2",highlightcolor="black",pady="0",text='''=''', command =lambda: Operacion()).place(relx=0.81, rely=0.74, height=40, width=40)
 
Cuarta_Ventana.mainloop()
 
  

miércoles, 23 de marzo de 2022

Interfaz Gráfica en Python, Tkinter

En las entradas anteriores se explican y aplican las diferentes correlaciones numéricas utilizadas en la obtención de las propiedades físicas del gas, petróleo y agua, dichas correlaciones son de vital importancia en la industria petrolera, dado que facilitan las propiedades de una manera analítica evitando el sesgo de los métodos gráficos.

Ahora en esta entrada se aborda una herramienta que es de mucha utilidad en el ámbito escolar y laboral, la biblioteca Tkinter, esta biblioteca es de gran ayuda para crear interfaces gráficas, por ello en las siguientes entradas se realizan las interfaces gráficas de las propiedades físicas del gas, petróleo y agua. En esta primera entrada se realizan unas pequeñas demostraciones de lo que Tkinter puede realizar, al avanzar en las siguientes entradas se mostraran las diferentes herramientas con las que cuenta la biblioteca.

A continuación se muestran dos códigos, el primero muestra una ventana vacía con el cual se busca mostrar cada uno de los componentes de la ventana de manera general. El segundo código muestra una ventana con un botón que imprime “Hola, Mundo”. Nota: Primero se explican las nuevas líneas de código y después se muestra el código completo, así como imágenes de lo que realiza el código.

Las siguientes líneas indican cómo se manda llamar la biblioteca  Tkinter, la primera línea indica que se llama a toda la biblioteca Tkinter, esto se realiza de este modo para tener todos los módulos disponibles en el código, en la segunda línea se importa el módulo Tkinter bajo el nombre de tk. Cada vez que se requiera alguna función de la biblioteca se deberá de llamar con tk.

 

from tkinter import *

import tkinter as tk

 

            Ahora se muestra el código de una ventana sin ningún ítem o artículo dentro de ella.  En la primera línea se realiza una llamada a la biblioteca y se asigna el nombre de la ventana, recuerde que este nombre es para el código por ello no será visible para el usuario.

 

Primera_Ventana = Tk()

 

En las siguientes tres líneas se determinan las dimensiones de la ventana, para ello se manda llamar geometry que pertenece a la biblioteca Tkinter y se ingresan las dimensiones de la ventana, en este caso se ingresa un largo de 400  y un ancho de 300. Las funciones maxsize y minsize evitan que la ventana cambie de forma no deseada. Nota: Si no se colocan las mismas medidas en estas líneas la ventana se deformará y provocará que los ítems de la ventana salgan de la posición seleccionada.

 

Primera_Ventana.geometry("300x400")

Primera_Ventana.maxsize(300,400)

Primera_Ventana.minsize(300,400)

 

Las siguientes dos líneas son las propiedades de la ventana, en la primera línea se observa la función title la cual permite colocar el título de la  ventana, en este caso la ventana se llama Primera ventana. En la siguiente línea se encuentra la función configure la cual permite cambiar el color de la ventana, el tipo de letra, el color de la letra, etc.

 

Primera_Ventana.title("Primera Ventana")

Primera_Ventana.configure(background="blue")

 

Para finalizar con este primer ejemplo se tiene la función mainloop la cual activa y mantiene abierta la ventana que sea creado, es muy importante agregar esta línea.

 

Primera_Ventana.mainloop()

 

Código completo del ejemplo:

 

Primera_Ventana = Tk()

Primera_Ventana.geometry("300x400")

Primera_Ventana.maxsize(300,400)

Primera_Ventana.minsize(300,400)

Primera_Ventana.title("Primera Ventana")

Primera_Ventana.configure(background="blue")

 

Primera_Ventana.mainloop()


El código devuelve lo siguiente:




En el siguiente ejemplo se muestra como se implementa una función la cual imprime “Hola, Mundo”.

En este ejemplo se agregan dos ítems los cuales son un botón y un mensaje, dichos ítems son importantes dado que el botón permite llamar funciones y el mensaje muestra el resultado de estas, se debe de aclarar que el mensaje no admite datos de entrada, sólo de salida.

            Para colocar un botón se requiere mandar llamar la función Button, dicha función recibe lo siguiente:

 

Boton = Button(

Segunda_Ventana, >>> el nombre de la ventana o el espacio que contendrá el botón

 activebackground="#ececec", >>>  el color que tendrá el botón al ser activado

 activeforeground="#000000", >>> el color de las letras al ser activado el botón

background="#d9d9d9", >>> el color del botón sin ser activado

disabledforeground="#a3a3a3", >>> el color del botón al estar desactivado

foreground="#000000", >>> el color de las letras

pady="0", >>> es el relleno adicional por encima y debajo del texto

text='''Imprimir''', >>> Se indica el texto que contiene el botón

command = Funcion >>> Manda llamar a la función deseada

 

place(relx=0.25, rely=0.35, height=44, width=157)  >>> la función place alberga la posición del botón dentro de la ventana o espacio que lo contiene, considera un sistema de coordenadas cartesianas en el que X es el eje horizontal y Y el vertical; además contiene el espesor y el ancho con el fin de dar el tamaño deseado al botón.

 

El código para un botón es el siguiente:

 

Boton = Button(Segunda_Ventana, activebackground="#ececec", activeforeground="#000000", background="#d9d9d9", disabledforeground="#a3a3a3", foreground="#000000", highlightbackground="#d9d9d9", highlightcolor="black", pady="0", text='''Imprimir''', command = Funcion).place(relx=0.25, rely=0.35, height=44, width=157)

 

El código del mensaje es parecido al código del botón, con la diferencia de una división en tres partes, en la primera parte se nombra al mensaje y se le da lugar en la ventana, la segunda parte se encuentra place esta función indica el lugar donde se coloca el mensaje, se utiliza el mismo sistema de coordenadas que en el botón, la última parte se trata de la configuración de los atributos del mensaje, los cuales son similares a los atributos que se explicaron anteriormente.

 

Mensaje = tk.Message(Segunda_Ventana)

Mensaje.place(relx=0.25, rely=0.55, height=44, width=157

Mensaje.configure(background="white",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",justify='center',text=''' ''')

 

El código completo se muestra a continuación:

 

Segunda_Ventana = Tk()

Segunda_Ventana.geometry("300x400")

Segunda_Ventana.maxsize(300,400)

Segunda_Ventana.minsize(300,400)

Segunda_Ventana.title("Segunda Ventana")

Segunda_Ventana.configure(background="turquoise3",highlightbackground="turquoise3",highlightcolor="black")

 

def Funcion():

 

            Mensaje = tk.Message(Segunda_Ventana)

            Mensaje.place(relx=0.25, rely=0.55, height=44, width=157)#218#873

Mensaje.configure(background="white",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",justify='center',text='''Hola, Mundo''')

 

            return

 

Boton = Button(Segunda_Ventana,activebackground="#ececec",activeforeground="#000000",background="#d9d9d9",disabledforeground="#a3a3a3",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",pady="0",text='''Imprimir''',command = Funcion).place(relx=0.25, rely=0.35, height=44, width=157)

 

Mensaje = tk.Message(Segunda_Ventana)

Mensaje.place(relx=0.25, rely=0.55, height=44, width=157)#218#873

Mensaje.configure(background="white",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",justify='center',text=''' ''')

 

Segunda_Ventana.mainloop()

 

El código devuelve lo siguiente:

 

miércoles, 16 de marzo de 2022

Tensión interfacial Gas-Agua Ejemplo

Ahora se presenta un ejemplo de la entrada anterior, en el ejemplo se debe obtener la tensión interfacial gas-agua a una presión de 5000 psi y temperatura de 200 °F.

La solución al ejemplo es la siguiente:

# Tensión Interfacial

P = 5000 # psi

T = 200          # °F


A = 79.1618-0.118978*T

B = -5.28473*(10**-3)+9.87913*(10**-6)*T

C = (2.33814-4.57194*(10**-4)*T-7.52678*(10**-6)*(T**2))*(10**-7)

σgw=A+B*P+C*P**2

 

print("""

Resumen de Resultados - Tensión Interfacial Gas-Agua                                        σgw

Correlación de Jennings, H.Y., Jr. y Newman, G.H. ........ """+str(round(σgw,4))+""" lbs/pie^3

""")

 

El código devuelve lo siguiente:

Resumen de Resultados - Tensión Interfacial Gas-Agua                                        σgw

Correlación de Jennings, H.Y., Jr. y Newman, G.H. ........ 43.6858 lbs/pie^3

[Finished in 156ms]

 

Con este último ejemplo se termina la revisión a las propiedades físicas del Gas, Petróleo y Agua.

miércoles, 9 de marzo de 2022

Tensión interfacial Gas-Agua

La tensión interfacial gas-agua se mide en dinas/cm, se define como la fuerza por unidad de longitud en la interfase entre dos fluidos inmiscibles.

 

Donde P es la presión en psi y T es la temperatura en °F.

miércoles, 2 de marzo de 2022

Densidad del Agua Ejemplo

En el siguiente ejemplo se requiere determinar la densidad de una salmuera con 20000 ppm de solidos disueltos a una presión de 5000 psi y temperatura de 2000°F.

 # Densidad del agua

P = 5000 #psi

T = 200 # °F

S = 20000/10000

 

# Correlación de McCain, W.D., Jr.

 

ρw1=62.368+0.438603*S+1.60074*(10**-3)*(S**2)

γw= 1+0.65*(10**-6)*S

VwT= -1.0001*(10**-2)+1.33391*(10**-4)*T+5.50654*(10**-7)*(T**2)

Vwp= (-1.95301*(10**-9)*P*T)-(1.72834*(10**-13)*(P**2)*T)-(3.58922*(10**-7)*P)-(2.25341*(10**-10)*(P**2))

Bw = (1+Vwp)*(1+VwT)

ρw2 = ρw1/Bw

ρw3 = (62.4*γw)/Bw

 

print("""

Resumen de Resultados - Densidad del Agua                       ρw

 

Aproximación - A ........................ """+str(round(ρw2,4))+""" lbs/pie^3

Aproximación - B ........................ """+str(round(ρw3,4))+""" lbs/pie^3

 

Correlación de McCain, W.D., Jr. ........ """+str(round(ρw1,4))+""" lbs/pie^3

""") 

El código devuelve lo siguiente:

 

Resumen de Resultados - Densidad del Agua                       ρw

 

Aproximación - A ........................ 61.5251 lbs/pie^3

Aproximación - B ........................ 60.6968 lbs/pie^3

 

Correlación de McCain, W.D., Jr. ........ 63.2516 lbs/pie^3

 

[Finished in 190ms]