[Programación]GUI en python con TkInter...

Emiliano Gavilán emilianogavilan en gmail.com
Jue Ago 5 17:19:41 ART 2010


On Thu, Aug 05, 2010 at 11:50:57AM -0700, Horacio Castellini wrote:
> gracias... Emiliano tu ayuda es muy invaluable... 
> 
> Bueno, como última pregunta es como compatibilizar un grafo de valores.
> sin que se entre en conflicto... es decir en los programas python de
> cálculo que uso siempre coloco esta llamada a función...

Sobre el original comento ...


 
from SimPy.SimPlot import *

# le añadimos el titulo porque ya no tenemos sys.argv[0]!!
def Dibujar(w,xv,X,Y, titulo):
    Yt=[]
    Z1=[]
    Z2=[]
    NR=len(Y)
    for i in range(NR):
        Yt.append(xv[0]+xv[1]*math.sin(w*X[i])+xv[2]*math.cos(w*X[i]))
        Z1.append([X[i],Y[i]])
        Z2.append([X[i],Yt[i]])
#    printf "%f %f %f" % (X[i],Yt[i],Y[i])

# En vez de estas dos líneas, proba lo siguiente
#    plt=SimPlot()
#    plt.root.title("Reologia ajuste dinamico")

    top = Toplevel()
    top.title("Reologia ajuste dinamico")
    plt = SimPlot(top)

    linea1 = plt.makeSymbols(Z1,marker="dot",size=1,fillcolor="red")
    linea2 = plt.makeLine(Z2,color="green",witdth=2)
    obj = plt.makeGraphObjects([linea1,linea2])
    marco = Frame(plt.root)
    grafo = plt.makeGraphBase(marco,500,300,title=titulo)
    grafo.pack()
    grafo.draw(obj)
    marco.pack()
# Esta linea no es necesaria, ya tenemos un mainloop corriendo
    # plt.mainloop()

> 1- que (1) entre en conflicto con el mainloop() del código oroginal

Asi es, por eso lo saqué ...

> 2- Que no se me refresque el grafo,,, cosa que me está pasando...
> levanta un nuevo wiget cada cálculo... y no lo puedo empaquetar todo en
> un marco..

podes chequear que la ventana esta abierta y destruir (destroy()) el Frame
y crear uno nuevo. Para esto deberías guardar una referencia compartida
(en este caso un global, ya que no hay demasiados) para que esté disponible
en cada llamada.
Un ejemplo sería (ya removiendo lineas comentadas arriba):

# hacer esto al principio, despues de los imports
marco = None

def Dibujar(w,xv,X,Y, titulo):
    global marco ;# nuestro frame donde se encuentra el grafico
    Yt=[]
    Z1=[]
    Z2=[]
    NR=len(Y)
    for i in range(NR):
        Yt.append(xv[0]+xv[1]*math.sin(w*X[i])+xv[2]*math.cos(w*X[i]))
        Z1.append([X[i],Y[i]])
        Z2.append([X[i],Yt[i]])
    if marco and marco.winfo_exists():
    	top = marco.winfo_toplevel()
        marco.destroy() ;# el grafo todavia existe (no se cerro la ventana)
    else:
        top = Toplevel()
        top.title("Reologia ajuste dinamico")

    marco = Frame(top)
    plt = SimPlot(top)
    grafo = plt.makeGraphBase(marco,500,300,title=titulo)
    grafo.pack()

    linea1 = plt.makeSymbols(Z1,marker="dot",size=1,fillcolor="red")
    linea2 = plt.makeLine(Z2,color="green",witdth=2)
    obj = plt.makeGraphObjects([linea1,linea2])
    grafo.draw(obj)
    marco.pack()


Este codigo es "highly untested" !!!

> A lo mejor en TkInter existe alguna forma piola de evitar usar el paquete
> simpy y graficar datos... si la hay acepto sugerencias... 

Piola como piola no. En realidad el paquete ScimPlot está usando el widget
Canvas para el dibujo, por lo que te está evitando hacerlo a manopla ...


Saludos

Emiliano


Más información sobre la lista de distribución Programacion