我一直在尝试开发一个小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()
当您输入字段时,函数会调用,但在键入下一个字符之前不会更新为键入的内容。我如何才能让标签更新到当时的字段?
答案 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()