2012-04-04 74 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