Mejorar este código

eber_ramirez en ltv.org.mx eber_ramirez en ltv.org.mx
Mie Mayo 7 22:01:04 CEST 2008


Este es el primer programa que hago en Python, así que agradeceré sugerencias para mejorar el código.
Seleccioné Tkinter porque pienso usar el programa en la PC (WinXP & Linux) y en la Pocket PC, y en esta última plataforma no requiere instalarse nada más.
Por supuesto que todavía requiere que se agreguen capturas de errores, como cuando el usuario no introduce los tipos de datos requeridos y cosas así, pero por lo menos, agradeceré me den sus recomendaciones sobre el uso de 'Entry', 'grid' y todas esas cosas.
Ah, me he basado en el libro: "Python 2.1 Bible" de Dave Brueck and Stephen Tanner, cap. 19 "Tinkering with Tkinter", ejemplo19-5.
Aquí va el código. Gracias de antemano.

# Version 0.1
# Miercoles 7 de mayo de 2008
# gerberito en gmail.com

# Calculo del momento resistente (MR) de una seccion
# rectangular de concreto sin acero a compresion
# utilizando el Reglamento de construcciones del
# Distrito Federal, Normas Tecnicas Complementarias
# edicion 2004, Mexico.


from Tkinter import *
import math
import tkMessageBox

#Creamos la clase que es la base del programa
class Calcula_MR:
    def __init__(self):
        self.CreaObjetos()

    def CreaObjetos(self):
        self.programa = Tk(  )  # 'Ventana principal' de Tkinter's
        self.programa.title ('Momento Resistente - Sin acero a compresion')
        #MarcoPrincipal=Frame(self.programa)
        
        #Primero creamos el cuadro de dialogo para introducir datos.
        # FR = Factor de reduccion, por default 0.9
        # b = ancho de la seccion en cm
        # d = peralte efectivo de la seccion en cm
        # f'c = resistencia del concreto a la compresion a los 28 dias en kg/cm2
        # fy = Limite de fluencia del acero en kg/cm2
        # As = Area de acero en tension en cm2

        # Ahora creamos las zonas donde el usuario introduce datos

        # Primero ponemos las etiquetas de los datos que ocuparemos
        fila = 1
        for label in 'FR ', 'b ', 'd ', 'fc ', 'fy ', 'As ':
            Etiqueta=Label(self.programa, text=label+'=', borderwidth=6)
            Etiqueta.grid(row=fila,column=0)
            #Label(self.programa,text=label+'=', borderwidth=6).grid(row=fila, column=0)
            fila = fila + 1

            
        #Ahora las unidades en las que se trabaja
        fila = 1
        for label in '  ', 'cm ', 'cm ', 'kg/cm2 ', 'kg/cm2 ', 'cm2 ':
            Etiqueta=Label(self.programa, text=label, borderwidth=6)
            Etiqueta.grid(row=fila,column=2)
            #Label(self.programa,text=label, borderwidth=6).grid(row=fila, column=2)
            fila = fila + 1

        # Finalmente los 'entry's para introducir los valores
        #self.FR_t=Entry(self.programa, width=10)
        #self.FR_t.grid(row=1,column=1)
        #self.FR_t.insert(INSERT, '0.9')
        
        #self.As_t=Entry(self.programa, width=10)
        #self.As_t.grid(row=6,column=1)
        #self.As_t.insert(INSERT,'2.54')
        
        self.FR_t=StringVar()
        Entry(self.programa, width=10, textvariable=self.FR_t).grid(row=1, column=1)
        self.FR_t.set('0.9')

        self.b_t=StringVar()
        Entry(self.programa, width=10, textvariable=self.b_t).grid(row=2, column=1)
        self.b_t.set('20')
        
        self.d_t=StringVar()
        Entry(self.programa, width=10, textvariable=self.d_t).grid(row=3, column=1)
        self.d_t.set('40')
        
        self.fc_t=StringVar()
        Entry(self.programa, width=10, textvariable=self.fc_t).grid(row=4, column=1)
        self.fc_t.set('250')
        
        self.fy_t=StringVar()
        Entry(self.programa, width=10, textvariable=self.fy_t).grid(row=5, column=1)
        self.fy_t.set('4200')
        
        self.As_t=StringVar()
        Entry(self.programa, width=10, textvariable=self.As_t).grid(row=6, column=1)
        self.As_t.set('2.54')
        
        Button(self.programa, text='Calcula',command=self.Calculos).grid(row=9,column=0,columnspan=3, sticky=W+E+N+S)
        Button(self.programa, text='Acerca de...',command=self.About).grid(row=10,column=0,columnspan=3, sticky=W+E+N+S)
        Label(self.programa, text='CALCULA MR EN SECCIONES DE CONCRETO', borderwidth=6).grid(row=0, column=0, columnspan=3)

        self.Resultados=StringVar()
        Label(self.programa, width=30, textvariable=self.Resultados).grid(row=7, column=0, columnspan=3)
        self.Resultados.set('    ')

    def Calculos(self):
        #Extraemos los datos de los "entry's"
        FR=float(self.FR_t.get())
        b=float(self.b_t.get())
        d=float(self.d_t.get())
        fc=float(self.fc_t.get())
        fy=float(self.fy_t.get())
        As=float(self.As_t.get())
        
        #Iniciamos los calculos
        p=As/(b*d)
        q=p*fy/(fc*0.8*0.85)
        MR=FR*As*fy*d*(1-0.5*q)/100000 #Convertimos el resultado a Ton-m

        # Desplegamos el resultado
        self.Resultados.set('p = %f\nq = %f\nMR = %f T-m' % (p,q,MR))

    def About(self):
        # El comercial que no debe faltar.
        tkMessageBox.showinfo("CALCULOS", "Este Programa calcula el Momento Resistente \nde una seccion rectangular de concreto sin acero a compresion,\n Reglamento de Construcciones del DF NTC2004, Mexico.\n gerberito en gmail.com")

    def Arranca(self):
        self.programa.mainloop()
        
if (__name__=="__main__"):
    Calcula_MR().Arranca()



Este correo electrónico y cualquier archivo transmitido con él son confidenciales y son solamente para el uso del individuo o entidad a la que van dirigidos. Si recibió este correo electrónico por error por favor notifique al administrador del sistema. Este mensaje contiene información confidencial y es dirigido a la persona implicada. Si usted no es esa persona no debería diseminar, distribuir o copiar este mensaje de correo electrónico.
This email and any files transmitted with it are confidential and intended solely for the use of the individual or entity to whom they are addressed. If you have received this email in error please notify the system manager. This message contains confidential information and is intended only for the individual named. If you are not the named addressee you should not disseminate, distribute or copy this e-mail.
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes





Más información sobre la lista de distribución Python-es