2012-04-04 108 views
7

我想創建一個彈出消息框,提示用戶輸入一個輸入。我在課堂裏有這個方法。我基於我的代碼this guide by java2s創建一個帶有輸入字段的彈出消息框

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) 

但在此,top = self.top = Toplevel(parent)不適用於我。

我有一個我想要完成的模型。

GUI mockup

我的程序結構看起來是這樣的:

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 

我怎樣才能在Python中創建一個消息框,其中接受用戶輸入?

+0

當你說「發送e將數據返回主窗體「你是什麼意思?這些數據是否會顯示在小部件中? – 2012-04-05 00:49:40

+0

通過發回數據,我的意思是值的是文本框存儲在一個變量,我稍後在程序中操作。 – Bharat 2012-04-05 01:06:04

回答

11

我對你的兩個不同的代碼塊有點困惑。只要解決第一個代碼塊,什麼都不會發生,因爲你永遠不會進入主循環。要做到這一點,您需要撥打。這樣做的典型方法是將按鈕添加到根小部件和一個回調函數綁定到按鈕(包括d=MyDialog()root.wait_window(d.top)

下面是一些基本的代碼,我希望你想要做什麼......

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

我從popupWindow中獲取值並在主程序中使用它(查看與b2關聯的lambda函數)。

主窗口:

Main window

「點擊我」 窗口:

click me window

主窗口,而 「點擊我」 是開放的:

Main window with greyed out "click me"

+0

我試過你的代碼。現在我如何將彈出的窗口中的值輸入到'mainWindow'類中? 也許我有方法'def getVal(self): \t \t在'popupWindow'類上返回self.e' 如何從'mainWindow'類中調用此方法? – Bharat 2012-04-05 01:15:12

+0

@mgilson,這正是我想要做的。我對如何從其他課程獲得價值感到困惑。我正在考慮Java的方面,我認爲類變量是私有的(popupWindow類中的變量「值」)。現在我明白了.. entryValue()方法做我想做的事情。 謝謝! – Bharat 2012-04-05 15:50:53

+0

是否有任何理由使用'top = self.top = Toplevel(master)'over'self.top = Toplevel(master)'? – 2018-02-15 20:35:40