2012-04-04 15 views
7

Deseo crear un cuadro de mensaje emergente que solicite al usuario ingresar una entrada. Tengo este método dentro de una clase. Estoy basando mi código en this guide by java2s.Creación de un cuadro de mensaje emergente con un campo de entrada

class MyDialog: 
    def __init__(self, parent): 
     top = self.top = Toplevel(parent) 

     Label(top, text="Value").pack() 

     self.e = Entry(top) 
     self.e.pack(padx=5) 

     b = Button(top, text="OK", command=self.ok) 
     b.pack(pady=5) 

    def ok(self): 
     print "value is", self.e.get() 
     self.top.destroy() 

root = Tk() 
d = MyDialog(root) 

root.wait_window(d.top) 

Pero en esto, top = self.top = Toplevel(parent) no funciona para mí.

Tengo una maqueta de lo que estoy tratando de lograr.

GUI mockup

Mi estructura del programa se ve algo como esto:

class MainUI: 
    def__int__(self): 
     ... 
     self.initUI() 

    def initUI(self): 
     ....... 
     Popup = Button(self, text="Enter Value", command=self.showPopup) 

    def showPopup(self): 
     #create the popup with an Entry here 

¿Cómo puedo crear un cuadro de mensaje en Python que acepta la entrada del usuario?

+0

Cuando dices "enviar e datos ingresados ​​a la forma principal "¿qué quieres decir? ¿Esta información se mostrará en un widget? –

+0

Al devolver datos, quiero decir que el valor es que el cuadro de texto se almacena en una variable que manipulo más adelante en el programa. – Bharat

Respuesta

11

Estoy un poco confundido acerca de sus dos bloques de código diferentes. Solo dirigiéndose al primer bloque de código, no pasa nada porque nunca ingresas al mainloop. Para hacer eso, debe llamar al root.mainloop(). La forma típica de hacer esto es añadir un botón para widget de raíz y atar una función de devolución de llamada al botón (que incluye d=MyDialog() y root.wait_window(d.top))

Aquí hay algo de código básico que espero hace lo que quiere ...

from Tkinter import * 
import sys 

class popupWindow(object): 
    def __init__(self,master): 
     top=self.top=Toplevel(master) 
     self.l=Label(top,text="Hello World") 
     self.l.pack() 
     self.e=Entry(top) 
     self.e.pack() 
     self.b=Button(top,text='Ok',command=self.cleanup) 
     self.b.pack() 
    def cleanup(self): 
     self.value=self.e.get() 
     self.top.destroy() 

class mainWindow(object): 
    def __init__(self,master): 
     self.master=master 
     self.b=Button(master,text="click me!",command=self.popup) 
     self.b.pack() 
     self.b2=Button(master,text="print value",command=lambda: sys.stdout.write(self.entryValue()+'\n')) 
     self.b2.pack() 

    def popup(self): 
     self.w=popupWindow(self.master) 
     self.b["state"] = "disabled" 
     self.master.wait_window(self.w.top) 
     self.b["state"] = "normal" 

    def entryValue(self): 
     return self.w.value 


if __name__ == "__main__": 
    root=Tk() 
    m=mainWindow(root) 
    root.mainloop() 

Obtengo el valor del popupWindow y lo uso en el programa principal (eche un vistazo a la función lambda asociada con b2).

Ventana principal:

Main window

"Soy más" ventana:

click me window

ventana principal, mientras que "haga clic en mí" es abierta:

Main window with greyed out "click me"

+0

Probé tu código. Ahora, ¿cómo paso el valor ingresado en esa entrada en el formulario que apareció nuevamente en la clase 'mainWindow'? Tal vez tengo el método 'def getVal (self): \t \t return self.e' en la clase' popupWindow' ¿Cómo puedo llamar esto desde la clase 'mainWindow'? – Bharat

+0

@mgilson, esto es exactamente lo que quería hacer. Me confundí un poco sobre cómo obtener el valor de la otra clase. Estaba pensando en términos de Java y asumí que las variables de clase eran privadas (la variable 'valor' en la clase popupWindow). Ahora entiendo ... El método 'entryValue()' hace lo que yo quería hacer. ¡Gracias! – Bharat

+0

¿Hay alguna razón para usar 'top = self.top = Toplevel (master)' sobre 'self.top = Toplevel (master)'? –

Cuestiones relacionadas