2012-04-04 7 views
7

Desidero creare una finestra di messaggio popup che richiede all'utente di immettere un input. Ho questo metodo all'interno di una classe. Sto basando il mio codice su this guide by java2s.Creazione di una finestra di messaggio popup con un campo di immissione

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) 

Ma in questo, top = self.top = Toplevel(parent) non funziona per me.

Ho un mockup di ciò che sto cercando di realizzare.

GUI mockup

mia struttura di programma simile a questa:

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 

Come posso creare una finestra di messaggio in Python che accetta l'input dell'utente?

+0

Quando tu dici "invia e dati restituiti alla forma principale "cosa intendi? Questi dati verranno visualizzati in un widget? –

+0

Restituendo i dati, intendo che il valore è che la casella di testo è memorizzata in una variabile che manipolo più avanti nel programma. – Bharat

risposta

11

Sono un po 'confuso riguardo ai due diversi blocchi di codice. Semplicemente indirizzando il primo blocco di codice, non succede niente perché non entri mai nel mainloop. Per fare ciò, è necessario chiamare root.mainloop(). Il modo tipico di fare questo è quello di aggiungere un pulsante per widget di root e associare una funzione di callback per il pulsante (che comprende d=MyDialog() e root.wait_window(d.top))

Ecco un po 'di codice di base che spero fa quello che si vuole ...

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() 

Ricevo il valore dalla finestra popup e lo uso nel programma principale (date un'occhiata alla funzione lambda associata a b2).

Finestra principale:

Main window

"Click me" finestra:

click me window

Finestra principale, mentre "click me" è aperto:

Main window with greyed out "click me"

+0

Ho provato il tuo codice. Ora come faccio a passare il valore inserito in quella voce nel modulo che è tornato alla classe 'mainWindow'? Forse ho il metodo 'def getVal (self): \t \t return self.e' nella classe' popupWindow' Come si chiama dalla classe 'mainWindow'? – Bharat

+0

@ mgilson, questo è esattamente ciò che volevo fare. Mi sono un po 'confuso su come ottenere il valore dall'altra classe. Stavo pensando in termini di Java e ho assunto che le variabili di classe fossero private (la variabile 'value' nella classe popupWindow). Ora capisco .. Il metodo 'entryValue()' fa quello che volevo fare. Grazie! – Bharat

+0

C'è qualche ragione per usare 'top = self.top = Toplevel (master)' su 'self.top = Toplevel (master)'? –

Problemi correlati