Tkinter中的文本输入

时间:2013-03-20 11:31:33

标签: python tkinter

目标

我正在尝试编写一个基本文件,我可以在所有其他程序中导入这些文件,这些程序将具有一个简单的函数,该函数将从用户输入然后返回它。

代码

为此,我有以下代码:

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

令我感到困惑的是:

  1. var没有我输入的值有空字符串''
  2. a.string变量具有我输入的值,我从shell中检查了它。
  3. 当我尝试将从a.getString()返回的字符串分配给shell中的var时,它就可以了。

    注意我是Tkinter编程的新手,并且不完全了解mainloop()的工作原理。所以也许这就是问题所在。但我不确定。

    规格

    OS:Linux Mint 14

    Python IDLE 2.7

    帮我解决这个问题。

4 个答案:

答案 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