Tkinter中的文本输入

Icy*_*ame 1 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()
Run Code Online (Sandbox Code Playgroud)

我还添加了一些脚本级代码,以便测试:

root = Tk()

getText('enter your name',root)

var = a.getString()

print var

root.mainloop()
Run Code Online (Sandbox Code Playgroud)

真令我困惑的是:

  1. var 没有我输入的值有空字符串 ''
  2. a.string 变量具有我输入的值,我从shell中检查了它.

当我试图从分配返回的字符串a.getString(),以var在shell,然后它的工作.

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

眼镜

操作系统:Linux Mint 14

Python IDLE 2.7

帮我解决这个问题.

Fab*_*dre 11

正如其他答案所述,您var在进入主循环之前打印,即在窗口实际运行之前打印,并且您的程序正在等待用户输入.

您可以依靠tkSimpleDialog家人来获取您的意见:

import Tkinter
import tkSimpleDialog

root = Tkinter.Tk()
var = tkSimpleDialog.askstring("Name prompt", "enter your name")
print var
Run Code Online (Sandbox Code Playgroud)

如果您想追求自己的方式,可以通过"ok"按钮回调(gettext在您的情况下)执行打印.您也可以在按下"ok"时生成虚拟事件并在主程序中绑定到此事件(http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/virtual-events.html)


Kev*_*vin 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
Run Code Online (Sandbox Code Playgroud)