Tkin中的文本输入

2024-09-28 21:59:35 发布

您现在位置:Python中文网/ 问答频道 /正文

目标

我试图写一个基本的文件,我可以导入到所有其他程序,将有一个简单的函数,将从用户的条目,然后返回它。

代码

为此,我有以下代码:

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中检查了这个值。

当我试图将从a.getString()返回的字符串赋给shell中的var时,它也工作了。

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

规格

操作系统:Linux Mint 14

Python空闲2.7

请帮助我解决这个问题。


Tags: 代码textselfstringvardefrootframe
3条回答

问题是,在显示对话框之前,您的测试例程已经输出了var的值,更不用说输入文本了。(通过向测试代码中添加一些print语句,可以很容易地验证这一点。)这是因为对mainloop()的调用在最后。相反,您应该在创建帧之后调用mainloop,但在读取并返回输入之前调用^{,例如,它可能转到getText方法:

def getText(requestMessage,parent):
    a = takeInput(requestMessage,parent)
    parent.mainloop()
    return a.getString()

这仍然不能很好地工作,因为您必须关闭对话框(单击[x]按钮),即使在单击“确定”之后,我也不确定如何解决这个问题。

但是,请注意,已经有这个模块,tkSimpleDialog,它提供了像askstring(title, prompt)这样的方法来显示这样的输入对话框。因此,您可以使用它们,或者查看源代码(可以在/usr/lib/python2.7/lib-tk或类似代码中找到)来了解它是如何完成的。

代码的流程如下:

  • 主作用域调用getText
  • getText创建一个takeInput对象a
  • 对象初始化自身,创建标签和按钮等
  • 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

如其他答案所示,在进入主循环之前,即在窗口实际运行之前,以及在程序等待用户输入之前,您可以打印var

您可以依赖tkSimpleDialog系列来获取您的输入:

import Tkinter
import tkSimpleDialog

root = Tkinter.Tk()
var = tkSimpleDialog.askstring("Name prompt", "enter your name")
print var

如果你想继续你的方式,你可以从“确定”按钮回调(在你的情况下,gettext)执行你的打印。您还可以在按下“确定”时生成一个虚拟事件,并在主程序中绑定到此事件(http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/virtual-events.html

相关问题 更多 >