目标
我正在尝试编写一个基本文件,我可以在所有其他程序中导入这些文件,这些程序将具有一个简单的函数,该函数将从用户输入然后返回它。
代码
为此,我有以下代码:
class takeInput(object):
def __init__(self,requestMessage,parent):
self.string = ''
self.frame = Frame(parent)
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.frame.destroy()
print self.string
def getString(self):
return self.string
def getText(requestMessage,parent):
global a
a = takeInput(requestMessage,parent)
return a.getString()
我还添加了一些脚本级代码,以便对此进行测试:
root = Tk()
getText('enter your name',root)
var = a.getString()
print var
root.mainloop()
令我感到困惑的是:
var
没有我输入的值有空字符串''
a.string
变量具有我输入的值,我从shell中检查了它。 当我尝试将从a.getString()
返回的字符串分配给shell中的var
时,它就可以了。
注意我是Tkinter编程的新手,并且不完全了解mainloop()
的工作原理。所以也许这就是问题所在。但我不确定。
规格
OS:Linux Mint 14
Python IDLE 2.7
请帮我解决这个问题。
答案 0 :(得分:11)
正如其他答案所述,您在进入主循环之前打印var
,也就是说,在您的窗口实际运行之前,您的程序正在等待用户输入。
您可以依靠tkSimpleDialog
家人来获取您的意见:
import Tkinter
import tkSimpleDialog
root = Tkinter.Tk()
var = tkSimpleDialog.askstring("Name prompt", "enter your name")
print var
如果你想追求自己的方式,你可以通过“ok”按钮回调(在你的情况下为gettext
)执行打印。您也可以在按下“确定”时生成虚拟事件并在主程序中绑定到此事件(http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/virtual-events.html)
答案 1 :(得分:7)
您的代码流程如下:
getText
。getText
创建了一个takeInput
对象a
。takeInput
对象初始化自己,创建标签&按钮等。getText
返回a.getString()
,返回self.string
,仍然有默认值,空字符串。var
,为空。到目前为止,所有这一切都发生在几纳秒的范围内。用户还没有看到窗口。
主范围然后调用root.mainloop()
,最终使用户有机会与窗口进行交互。但为时已晚。 var
已经打印出来。
如果您希望getText
在用户提交文字之前不返回,则mainloop
必须在getText
内发生,而不是在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
之后发生。
{{1}}
答案 2 :(得分:1)
问题是您的测试例程在显示对话框之前已经打印出var
的值,更不用说输入文本了。 (您可以通过在测试代码中添加一些print
语句来轻松验证这一点。)这是因为对mainloop()
的调用最后。相反,您应该在创建框架后调用mainloop
,但在读取并返回输入之前,例如它可能会转到您的getText
方法:
def getText(requestMessage,parent):
a = takeInput(requestMessage,parent)
parent.mainloop()
return a.getString()
这仍然不能很好地工作,因为你必须关闭对话框(点击[x]
- 按钮),即使点击'okay',我也不知道如何解决这个问题。
但请注意,已经 的模块为tkSimpleDialog
,提供了显示此类输入对话框的askstring(title, prompt)
等方法。所以你可以使用它们,或者查看源代码(在/usr/lib/python2.7/lib-tk
中找到)等,以了解它是如何完成的。
答案 3 :(得分:0)
这是一个简短的摘要:
import tkinter
from tkinter import simpledialog
root = tkinter.Tk()
# withdraw() will make the parent window disappear.
root.withdraw()
# shows a dialogue with a string input field
youtube_url = simpledialog.askstring('YouTube URL', 'Enter the youtube URL of the video', parent=root)
if str(youtube_url).startswith('http'):
pass
else:
pass