<p>代码的流程如下:</p>
<ul>
<li>主作用域调用<code>getText</code>。</li>
<li><code>getText</code>创建一个<code>takeInput</code>对象<code>a</code>。</li>
<li>对象初始化自身,创建标签和按钮等</li>
<li><code>getText</code>返回<code>a.getString()</code>,返回<code>self.string</code>,该值仍有其默认值空字符串。</li>
<li>主作用域打印空的<code>var</code>。</li>
</ul>
<p>到目前为止,所有这些都是在几纳秒的时间内发生的。用户甚至还没有看到窗口。</p>
<p>然后主作用域调用<code>root.mainloop()</code>,这最终为用户提供了与窗口交互的机会。但为时已晚。<code>var</code>已打印。</p>
<p>如果希望<code>getText</code>在用户提交文本之前不返回,则<code>mainloop</code>必须出现在<code>getText</code>内部,而不是之后。</p>
<pre><code>from Tkinter import *
class takeInput(object):
def __init__(self,requestMessage):
self.root = Tk()
self.string = ''
self.frame = Frame(self.root)
self.frame.pack()
self.acceptInput(requestMessage)
def acceptInput(self,requestMessage):
r = self.frame
k = Label(r,text=requestMessage)
k.pack(side='left')
self.e = Entry(r,text='Name')
self.e.pack(side='left')
self.e.focus_set()
b = Button(r,text='okay',command=self.gettext)
b.pack(side='right')
def gettext(self):
self.string = self.e.get()
self.root.destroy()
def getString(self):
return self.string
def waitForInput(self):
self.root.mainloop()
def getText(requestMessage):
msgBox = takeInput(requestMessage)
#loop until the user makes a decision and the window is destroyed
msgBox.waitForInput()
return msgBox.getString()
var = getText('enter your name')
print "Var:", var
</code></pre>