从Entry Widgets TKinter不断更新标签小部件

时间:2014-07-18 19:18:39

标签: python tkinter widget

我正在尝试使用TKinter创建一个表单,该表单从/多个条目窗口小部件中获取信息并将它们用作文本窗口小部件的值。例如,这可能有效:

import Tkinter
from Tkinter import *
top = Tk()


e1 = Entry(top)
e2 = Entry(top)
t = Label(top, text = e1.get() + e2.get())
e1.pack()
e2.pack()
t.pack()

top.mainloop()

问题是这不会自动更新。我知道可以使用按钮完成,但我希望在用户键入Entry小部件时在Label小部件中计算/更新信息。什么是最好的是这样做?以下实现的while循环不起作用,因为程序进入top.mainloop()并且不退出:

import Tkinter
from Tkinter import *
top = Tk()


e1 = Entry(top)
e2 = Entry(top)
t = Label(top, text = e1.get() + e2.get())
e1.pack()
e2.pack()

while True:

    t = Label(top, text = e1.get() + e2.get())
    t.pack()
    top.mainloop()

提前谢谢你。 六

1 个答案:

答案 0 :(得分:3)

while True无法正常工作,因为mainloop()是某种while True循环,它会一直有效,直到你停止程序。


您必须使用after(time_in_millisecond, function_name)function_name添加到特殊队列,而mainloop()将在time_in_millisecond之后运行after()。已执行的函数可以使用time_in_millisecondStringVar之后再次运行。


第二个解决方案:您可以将EntryStringVar一起使用,然后您可以将函数分配给trace()(使用StringVar),每次<Key>时都会执行此功能1}}将被更改。


第三个解决方案:您可以将事件(Entry)绑定到validatecommand=,当您在Entry中按键时,它将调用某个函数。


上一个解决方案:当条目中的文字发生变化时,您可以validate=使用Entry validatecommand=来调用某些功能。


见Tkinterbook:
The Tkinter Entry Widget
Events and Bindings
The Variable Classes (BooleanVar, DoubleVar, IntVar, StringVar)


编辑:

validate=validatecommand=的示例。

并非所有小部件都有from Tkinter import * #------------------------------------ def my_validater(): new_text = e1.get() + e2.get() # different method to set label text (without StringVar) #t['text'] = new_text t.config(text=new_text) # validater have to return True or False return True #------------------------------------ top = Tk() #--- t = Label(top) t.pack() #--- e1 = Entry(top, validate='key', validatecommand=my_validater) # validate every key e1.pack() #--- e2 = Entry(top, validate='key', validatecommand=my_validater) # validate every key e2.pack() #--- top.mainloop() #------------------------------------

StringVar

tracefrom Tkinter import * #------------------------------------ def my_tracer(a, b, c): # trace send 3 arguments to my_tracer #print a, b, c # using StringVar to get and set text new_text = e1_var.get() + e2_var.get() t_var.set(new_text) #------------------------------------ top = Tk() #--- t_var = StringVar() # or StringVar(top) t = Label(top, textvariable=t_var) t.pack() #--- e1_var = StringVar() # or StringVar(top) e1_var.trace('w', my_tracer) # run my_tracer if value was changed (w = write) e1 = Entry(top, textvariable=e1_var) e1.pack() #--- e2_var = StringVar() # or StringVar(top) e2_var.trace('w', my_tracer) # run my_tracer if value was changed (w = write) e2 = Entry(top, textvariable=e2_var) e2.pack() #--- top.mainloop() #------------------------------------

的示例

可能是大多数小部件的最佳解决方案。

bind(<Key>, ...)

Entry

的示例

在将char放入Entry之前调用绑定函数,以便在event.char中获得没有最后一个字符的文本。这种方法不适合这种情况,但我保留了它。 最终,您可以获得from Tkinter import * #------------------------------------ def my_bind(event): # bind send 1 argument to my_bind # different type of event can have different atributes #print event, event.widget, event.char, event.keysym, event.keycode new_text = e1.get() + e2.get() t.config(text=new_text) #------------------------------------ top = Tk() #--- t = Label(top) t.pack() #--- e1 = Entry(top) e1.pack() e1.bind('<Key>', my_bind) #--- e2 = Entry(top) e2.pack() e2.bind('<Key>', my_bind) #--- top.mainloop() #------------------------------------ 并将缺少的字符添加到文本中。

after()

from Tkinter import * #------------------------------------ def my_after(): new_text = e1.get() + e2.get() t.config(text=new_text) # call again after 100 ms top.after(100, my_after) #------------------------------------ top = Tk() #--- t = Label(top) t.pack() #--- e1 = Entry(top) e1.pack() #--- e2 = Entry(top) e2.pack() #--- # call first time my_after() # call first time after 100 ms #top.after(100, my_after) #--- top.mainloop() #------------------------------------ 的示例。

用于不同的重复工作。

{{1}}