Python 为什么与Tkinter中的事件绑定时会出现一步延迟?如何解决此问题?
考虑以下简单代码:Python 为什么与Tkinter中的事件绑定时会出现一步延迟?如何解决此问题?,python,python-3.x,tkinter,python-3.6,Python,Python 3.x,Tkinter,Python 3.6,考虑以下简单代码: from tkinter import * startingWindow = Tk() entry = Entry(startingWindow) entry.grid(row=0, column=0) def writeWhatYouGet(): print((entry.get()).strip()) entry.bind('<Key>', lambda event:writeWhatYouGet()) startingWind
from tkinter import *
startingWindow = Tk()
entry = Entry(startingWindow)
entry.grid(row=0, column=0)
def writeWhatYouGet():
print((entry.get()).strip())
entry.bind('<Key>', lambda event:writeWhatYouGet())
startingWindow.mainloop()
但是,我希望输出结果如下所示:
1
12
123
1234
我如何才能解决这个问题,以便立即获得我编写的内容?我不明白为什么您的代码不起作用,但我可以提供一个确实起作用的解决方案 将条目与StringVar关联,然后跟踪对StringVar的所有更改:
from tkinter import *
startingWindow = Tk()
text = StringVar()
entry = Entry(startingWindow, textvariable=text)
entry.grid(row=0, column=0)
def writeWhatYouGet(*args):
print(text.get())
text.trace_add("write", writeWhatYouGet) # Trace changes to StringVar "text"
startingWindow.mainloop()
引用:发生这种行为是因为在条目中插入键的类绑定是在小部件绑定之后执行的。因此,在执行writeWhatYouGet时,条目还不包含\新密钥。您可以使用以下代码对此进行检查:
from tkinter import *
startingWindow = Tk()
entry = Entry(startingWindow)
entry.grid(row=0, column=0)
def writeWhatYouGet():
print('bind', (entry.get()).strip())
def writeWhatYouGet2():
print('bind_class', (entry.get()).strip())
entry.bind('<Key>', lambda event:writeWhatYouGet())
entry.bind_class('Entry', '<Key>', lambda event:writeWhatYouGet2(), True)
startingWindow.mainloop()
有关条目验证的更多详细信息:相关:@downvoter,请在downvoting时发表评论。Beind duplicate不值得投否决票,只需标记为dublicate即可。@AhmedWas否决票可能有很多原因。你不应该认为原因是专门为重复的职位,虽然人们不投票反对这一原因。例如,在你的问题中,你只描述了你遇到的一个问题,但没有展示任何解决问题的尝试,也没有展示你在发帖前自己试图解决的问题。因此,我认为否决票是因为缺乏努力,而不是重复的帖子。不管你是否尝试过解决问题,你的帖子不会给出很好的解释。谢谢,伙计。顺便说一句,python 3.6中不推荐使用text.tracew,writeWhatYouGet语法,新语法是text.trace\u addwrite,writeWhatYouGet。
from tkinter import *
startingWindow = Tk()
entry = Entry(startingWindow)
entry.grid(row=0, column=0)
def writeWhatYouGet():
print('bind', (entry.get()).strip())
def writeWhatYouGet2():
print('bind_class', (entry.get()).strip())
entry.bind('<Key>', lambda event:writeWhatYouGet())
entry.bind_class('Entry', '<Key>', lambda event:writeWhatYouGet2(), True)
startingWindow.mainloop()
from tkinter import *
startingWindow = Tk()
def writeWhatYouGet(text):
print(text.strip())
return True
validatecmd = startingWindow.register(writeWhatYouGet)
entry = Entry(startingWindow, validate='key', validatecommand=(validatecmd, '%P'))
# %P means that the value the text will have if the change is allowed is passed to validatecmd.
entry.grid(row=0, column=0)
startingWindow.mainloop()