Bueno que hace tiempo no posteo nada... realmente he estado bastante liado con el trabajo... Interesante este curso, lastima que no siga... No obstante aportare mi granito..
Las interfaces graficas, por un problema de reusabilidad, organizacion y otras razones deben programarse utilizando un modelo orientado a objetos.
Nota sobre los
Frames: Los frames son widgets que pueden contener otros widgets como botones, etiquetas, etc. Permiten agrupar controles.
from Tkinter import *
class Application(Frame):
""" GUI application which counts button clicks. """
def __init__(self, master):
""" Inicializa el Frame. """
Frame.__init__(self, master)
self.grid()
self.bttn_clicks = 0 # the number of button clicks
self.create_widgets()
def create_widgets(self):
""" Crea widgets. """
self.lbl = Label(self, text="Total Clicks: 0")
self.lbl.grid()
self.bttn = Button(self, text="ClickMe", command=self.update_count)
self.bttn.grid()
def update_count(self):
""" Increase click count and display new total. """
self.bttn_clicks += 1
self.lbl["text"] = "Total Clicks: "+ str(self.bttn_clicks)
root = Tk()
root.title("Click Counter")
root.geometry("200x50")
app = Application(root)
root.mainloop()
En este ejemplo se muestra como manejar Frames de forma independiente. En vez de heredar la clase Frame heredamos Tk.
from Tkinter import *
class FrameMan(Tk):
""" Gestion de Frames. """
def __init__(self):
""" Initialize the frame. """
Tk.__init__(self)
self.grid()
self.title("Simple Calculator.")
self.resizable(width = 0, height = 0)
self.geometry("200x75")
self.result = 0
self.createWidgets()
def createWidgets(self):
""" Creamos el Frame y demas controles hijos. """
self.myFrame1 = Frame(self)
self.myFrame2 = Frame(self)
self.myFrame1.grid(row = 0, column = 0)
self.myFrame2.grid(row = 0, column = 1)
self.Label1 = Label(self.myFrame1, text = "Este es el Frame 1")
self.Label2 = Label(self.myFrame2, text = "Este es el Frame 2")
self.Label1.grid()
self.Label2.grid()
self.Button1 = Button(self, text = "Dest 1", command = self.destF1)
self.Button2 = Button(self, text = "Dest 2", command = self.destF2)
self.Button1.grid(row = 1, column = 0)
self.Button2.grid(row = 1, column = 1)
def runApp(self):
""" Ejecutamos la aplicacion. """
self.mainloop()
def destF1(self):
self.myFrame1.destroy()
def destF2(self):
self.myFrame2.destroy()
root = FrameMan().runApp()
Por ultimo dos variantes de un mismo programa. Es una calculadora simple donde escogemos la operacion a realizar. Buen ejemplo, puesto que muestra el uso de diferentes controles, asi como el uso del
layout manager grid().
Variante 1:
from Tkinter import *
def showWindows():
root = Tk()
root.title("Simple Calculator.")
root.resizable(width = 0, height = 0)
root.geometry("370x75")
Application(root)
root.mainloop()
class Application(Frame):
""" Calculadora simple usando Tkinter. """
def __init__(self, master):
""" Initialize the frame. """
Frame.__init__(self, master)
self.grid()
self.result = 0
self.create_widgets()
def create_widgets(self):
""" Creamos controles hijos. """
self.numb1 = Entry(self)
self.numb1.grid(row = 0, column = 0, columnspan = 2, sticky = E)
self.numb1.insert(0, "0")
self.lblop = Label(self, text="?")
self.lblop.grid(row = 0, column = 1, sticky = E)
self.numb2 = Entry(self, text = "0")
self.numb2.grid(row = 0, column = 2, columnspan=2, sticky = E)
self.numb2.insert(0, "0")
self.lblEqual = Label(self, text = "=")
self.lblEqual.grid(row = 0, column = 5, sticky = E)
self.lblResult = Label(self, text = "Result")
self.lblResult.grid(row = 0, column = 6, sticky = E)
self.opr = StringVar()
self.opr.set = "?"
self.optSum = Radiobutton(self,
text = "+",
variable = self.opr,
value = "+",
command = self.upd_opr
).grid(row = 1, column = 0, sticky = W)
self.optRest = Radiobutton(self,
text = "-",
variable = self.opr,
value = "-",
command = self.upd_opr
).grid(row = 2, column = 0, sticky = W)
self.optMult = Radiobutton(self,
text = "*",
variable = self.opr,
value = "*",
command = self.upd_opr
).grid(row = 1, column = 1, sticky = W)
self.optDiv = Radiobutton(self,
text = "/",
variable = self.opr,
value = "/",
command = self.upd_opr
).grid(row = 2, column = 1, sticky = W)
self.btnCalc = Button(self, text = "Calcular", command = self.calc)
self.btnCalc.grid(row = 1, column = 2, rowspan = 2, sticky = E)
def upd_opr(self):
self.lblop["text"] = self.opr.get()
def calc(self):
""" Realizamos el calculo escogido. """
if self.opr.get() == "+":
self.result = float(self.numb1.get()) + float(self.numb2.get())
self.lblResult["text"] = self.result
elif self.opr.get() == "-":
self.result = float(self.numb1.get()) - float(self.numb2.get())
self.lblResult["text"] = self.result
elif self.opr.get() == "*":
self.result = float(self.numb1.get()) * float(self.numb2.get())
self.lblResult["text"] = self.result
elif self.opr.get() == "/":
self.result = float(self.numb1.get()) / float(self.numb2.get())
self.lblResult["text"] = self.result
showWindows()
Variante 2:
from Tkinter import *
class SimpleCalc(Tk):
""" Calculadora simple usando Tkinter. """
def __init__(self):
""" Initialize the frame. """
Tk.__init__(self)
self.grid()
self.title("Simple Calculator.")
self.resizable(width = 0, height = 0)
self.geometry("370x75")
self.result = 0
self.createWidgets()
def createWidgets(self):
""" Creamos el Frame y demas controles hijos. """
self.myFrame = Frame(self)
self.myFrame.grid()
self.numb1 = Entry(self.myFrame)
self.numb1.grid(row = 0, column = 0, columnspan = 2, sticky = E)
self.numb1.insert(0, "0")
self.lblop = Label(self.myFrame, text="?")
self.lblop.grid(row = 0, column = 1, sticky = E)
self.numb2 = Entry(self.myFrame, text = "0")
self.numb2.grid(row = 0, column = 2, columnspan=2, sticky = E)
self.numb2.insert(0, "0")
self.lblEqual = Label(self.myFrame, text = "=")
self.lblEqual.grid(row = 0, column = 5, sticky = E)
self.lblResult = Label(self.myFrame, text = "Result")
self.lblResult.grid(row = 0, column = 6, sticky = E)
self.opr = StringVar()
self.opr.set = "?"
self.optSum = Radiobutton(self.myFrame,
text = "+",
variable = self.opr,
value = "+",
command = self.updOpr
).grid(row = 1, column = 0, sticky = W)
self.optRest = Radiobutton(self.myFrame,
text = "-",
variable = self.opr,
value = "-",
command = self.updOpr
).grid(row = 2, column = 0, sticky = W)
self.optMult = Radiobutton(self.myFrame,
text = "*",
variable = self.opr,
value = "*",
command = self.updOpr
).grid(row = 1, column = 1, sticky = W)
self.optDiv = Radiobutton(self.myFrame,
text = "/",
variable = self.opr,
value = "/",
command = self.updOpr
).grid(row = 2, column = 1, sticky = W)
self.btnCalc = Button(self.myFrame, text = "Calcular", command = self.calcRes)
self.btnCalc.grid(row = 1, column = 2, rowspan = 2, sticky = E)
self.btnSal = Button(self.myFrame, text = "Salir", command = self.quitApp)
self.btnSal.grid(row = 1, column = 3, rowspan = 2, sticky = E)
def updOpr(self):
self.lblop["text"] = self.opr.get()
def runApp(self):
""" Ejecutamos la aplicacion. """
self.mainloop()
def quitApp(self):
""" Funcion que llama al evento destroy() del objeto Tk. """
self.quit()
def calcRes(self):
""" Realizamos el tipo de calculo escogido. """
if self.opr.get() == "+":
self.result = float(self.numb1.get()) + float(self.numb2.get())
self.lblResult["text"] = self.result
elif self.opr.get() == "-":
self.result = float(self.numb1.get()) - float(self.numb2.get())
self.lblResult["text"] = self.result
elif self.opr.get() == "*":
self.result = float(self.numb1.get()) * float(self.numb2.get())
self.lblResult["text"] = self.result
elif self.opr.get() == "/":
self.result = float(self.numb1.get()) / float(self.numb2.get())
self.lblResult["text"] = self.result
else:
tkMessageBox.showerror(title="Error!!!", message="Escoja un operador.").show()
#Corremos la aplicacion
root = SimpleCalc().runApp()
El metodo OOP o POO, como prefieran es harto flexible, y aunque en algunos casos complica la solucion a un problema, cuando se trata de interfaces graficas y eventos se hace conveniente su uso.
Para dudas respecto al codigo, busquen la(s) palabra(s) clave de la sección de codigo que despierte dudas en la ayuda de Python.