Tkinter Entry小部件需要两个事件才能更新

时间:2015-08-30 08:00:00

标签: python python-2.7 tkinter

我一直在尝试开发一个小gui来计算一些加权等总数。在尝试通过更改条目获得实时更新时,我注意到需要更新两个事件;这是我的代码的简化版本,显示了问题:

from Tkinter import *
root=Tk()
frame=Frame(root)
frame.pack()
entry=Entry(frame)
entry.pack()
label=Label(frame,text="entry:")
label.pack()
def updatelabel(event):
    label=Label(frame,text="entry:"+entry.get())
    label.pack()
    print "called"
entry.bind("<Key>", updatelabel)

root.mainloop()

当您输入字段时,函数会调用,但在键入下一个字符之前不会更新为键入的内容。我如何才能让标签更新到当时的字段?

3 个答案:

答案 0 :(得分:1)

您并不需要显式处理事件并使用回调函数来完成您想要的任务。换句话说,可以StringVar()自动使用from Tkinter import * root=Tk() frame=Frame(root) frame.pack() entry_var = StringVar() entry_var.set('') entry = Entry(frame, textvariable=entry_var) entry.pack() label = Label(frame, text='entry: ') label.pack(side=LEFT) contents = Label(frame, textvariable=entry_var) contents.pack(side=LEFT) entry.focus_set() # force initial keyboard focus to be on entry widget root.mainloop() 为您执行此操作。

if gesture.state == UIGestureRecognizerState.Ended { //code }

答案 1 :(得分:0)

不,它不需要调用两个条目,在第一个条目上调用它。密钥绑定位于Entry小部件上,以避免在有多个条目小部件的情况下绑定到root的问题。

import tkinter as tk

class SmallApp(tk.Frame):
    def __init__(self, master = None):
        tk.Frame.__init__(self, master)
        self.master = master
        self.pack()
        self.entry = tk.Entry(self)
        self.entry.pack()
        self.var = "entry:"
        self.label = tk.Label(text = self.var)
        self.label.pack()
        self.entry.bind("<Key>", self.updatelabel)

    def updatelabel(self, event):
        self.var += event.char
        self.label.configure(text=self.var)

root = tk.Tk()
app = SmallApp(root)
app.mainloop()

答案 2 :(得分:0)

我没有使用entry.bind("<Key>", update label),而是使用了根窗口:root.bind("<Key>", update label)。这样做了,但重要的是要意识到每次在tkinter窗口中按下某个键时都会调用函数updatelabel()。如果您有多个输入框更新标签,这可能会导致一些问题。

以下是我编写的代码,稍作修改:

from Tkinter import *

root=Tk()
frame=Frame(root)
frame.pack()
update_label = StringVar()  # Made a StringVar so you don't get new labels every time a key is pressed.
update_label.set("entry:")
entry=Entry(frame)
entry.pack()

label=Label(frame,textvariable=update_label)  # Used textvariable= instead of text=
label.pack()

def updatelabel(event):
    update_label.set("entry:" + entry.get())  # Setting the variable used in textvariable=
    print "called"

root.bind("<Key>", updatelabel)  # Changed entry.bind to root.bind

root.mainloop()