2012-04-04 11 views
7

Ich möchte ein Popup-Meldungsfeld erstellen, das den Benutzer auffordert, eine Eingabe einzugeben. Ich habe diese Methode in einer Klasse. Ich stütze meinen Code auf this guide by java2s.Erstellen eines Popup-Meldungsfelds mit einem Eingabefeld

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) 

Aber in diesem top = self.top = Toplevel(parent) nicht für mich arbeiten.

Ich habe ein Modell von dem, was ich versuche zu erreichen.

GUI mockup

Meine Programmstruktur sieht wie folgt aus etwas:

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 

Wie kann ich ein Meldungsfeld in Python zu erstellen, die Benutzereingaben akzeptiert?

+0

Wenn du sagst "sende e Daten zurück zum Hauptformular "Was meinst du? Werden diese Daten in einem Widget angezeigt? –

+0

Durch das Zurücksenden von Daten meine ich, dass das Textfeld in einer Variablen gespeichert wird, die ich später im Programm manipuliere. – Bharat

Antwort

11

Ich bin ein wenig verwirrt über Ihre zwei verschiedenen Blöcke von Code. Wenn Sie nur den ersten Codeblock adressieren, passiert nichts, weil Sie niemals die Hauptschleife eingeben. Um dies zu tun, müssen Sie root.mainloop() anrufen. Der typische Weg, dies zu tun, ist eine Schaltfläche, um Root-Widget hinzufügen und eine Callback-Funktion auf die Taste binden (die d=MyDialog() und root.wait_window(d.top) enthält)

Hier einige grundlegende Code, ich hoffe, das tut, was Sie wollen ...

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

Ich bekomme den Wert aus dem PopupWindow und benutze es im Hauptprogramm (schauen Sie sich die Lambda-Funktion an, die zu b2 gehört).

Hauptfenster:

Main window

"Klick mich" Fenster:

click me window

Hauptfenster, während "Klick mich" ist geöffnet:

Main window with greyed out "click me"

+0

Ich habe deinen Code ausprobiert. Wie übertrage ich nun den in diesem Eintrag eingegebenen Wert in der Form, die in die 'mainWindow'-Klasse zurückgekehrt ist? Vielleicht habe ich Methode 'def getVal (self): \t \t Rückgabe self.e' auf der' popupWindow' Klasse Wie rufe ich das aus der 'mainWindow' Klasse? – Bharat

+0

@mgilson, das ist genau das, was ich wollte. Ich bin ein wenig verwirrt darüber, wie man den Wert von der anderen Klasse bekommt. Ich dachte in Bezug auf Java und ich nahm an, dass die Klassenvariablen privat waren (die Variable 'value' in der popupWindow-Klasse). Jetzt verstehe ich .. Die Methode 'entryValue()' macht, was ich machen wollte. Vielen Dank! – Bharat

+0

Gibt es einen Grund, 'top = self.top = Toplevel (Master)' über 'self.top = Toplevel (Master)' zu verwenden? –

Verwandte Themen