TKinter:从TopLevel()中的Entry-Widget重用输入

时间:2016-12-07 19:19:01

标签: python tkinter

论坛上最近发布了一篇@Clueless_captain的问题;它是由@furas回答的。我是stackoverflow的新手,所以我不能在那个Conversation中发表评论。这是该对话的URL:(Tkinter Entry widget stays empty in larger programs (Python 2))。 furas发布的代码并不是我尝试做的,但我唯一不能做的就是找到一种方法来重用EntryWidget中给出的Input。我修改了由furas编写的代码;我的目标是在GUI终止之前打印输入。为此,我将Return键绑定到一个新的Function,这个Function应该在这个新的Function中得到Textstring,它将被进一步处理。它只会在我单击按钮以获取第二次名称时执行此操作。该代码的顺序是否已关闭?我相信这个问题与String' e.bind'密切相关。在第十行,但我找不到问题。

最诚挚的问候,G_Lehmann

----------修改后的代码:

from Tkinter import *

def get_input(text, variable):
    win = Toplevel()
    win.title("Get value")

    f = LabelFrame(win, text=text)
    f.pack()

    e = Entry(win, textvariable=variable)
    e.bind("<Return>", do_more(text, variable, e))
    e.pack(side="right")
    #I tried e.bind here, but This had no Effect.

    b = Button(win, text = "Cancel", command=win.destroy)
    b.pack()
#do_more is the new Function I want to use to process the Variable 'data' further.
def do_more(text, variable, e):
    data = e.get()
    print data
    print len(data)
    print type(data)

def get_value(text, variable):
    get_input(text, variable)

# --- main --

root = Tk()
root.title("Ask-name-SUB")

# global variables
var_name = StringVar()
var_address = StringVar()

b = Button(root, text="Enter your name", command=lambda: get_value("Your name:", var_name))
b.pack()

b = Button(root, text="Enter your address", command=lambda: get_value("Your address:", var_address))
b.pack()

b = Button(root, text="Cancel", command=root.destroy)
b.pack()

root.mainloop()

# --- after -- (My Edit: I disabled this as I want to bind the Variables before my GUI gets terminated)
"""
name = var_name.get()
print "Print name, its length, its type"
print name, len(name), type(name)

address = var_address.get()
print "Print address, its length, its type"
print address, len(address), type(address)
"""

1 个答案:

答案 0 :(得分:0)

gunicorn --version gunicorn (version 19.6.0) 需要函数名称(如bind中所示),因此必须使用command=为参数赋值函数。除了使用参数lambda绑定执行函数,所以你必须接收它。

event

您也可以将 e.bind("<Return>", lambda event:do_more(variable)) 分配给按钮

do_more

并对b = Button(win, text="OK", command=lambda:do_more(variable)) Return执行相同的操作 - 并在对变量执行某些操作后关闭窗口。

关闭窗口后,您也可以在Button中执行相同操作,但必须使用get_value,因为通常tkinter创建窗口并且不会等到关闭它。

所以现在你有两种可能有价值的东西 - 在win.wait_window()do_more - 选择一个。两种方法都可以修改 - 即。你可以使用类并创建自己的对话窗口。

get_value