【发布时间】:2015-09-15 17:58:12
【问题描述】:
使用python3。我是 tkinter 的新手,使用 GUI 编写程序,该程序接受一些输入参数并进行一些数据处理,所以它需要输入框,我可以在其中输入数字。
我一生都无法弄清楚如何让输入框停止滞后,即:当一个框被单击并输入时,对该输入框中的文本所做的更改直到我出现单击窗口中的另一个按钮或文本框。从功能上讲,该程序仍然可以这样工作,但是看不到我正在输入的内容令人恼火,其他人最终会使用该软件。
通过放入事件绑定以便按键触发空闲任务的更新,我已经解决了一半的问题。现在输入时文本会更新,但它是“一个字母慢”(输入的字母仅在输入下一个字母后出现),这仍然不理想。
帮助?
MWE:
from tkinter import *
###Window: 'top'
top = Tk() #make window
top.geometry("670x360") #window size
top.wm_title("Test program for TKinter")#window title
#window and label background colour
bgcol='light sea green'
top.configure(background=bgcol) #set colour
#events to refresh window
def keypress(event):
print('key pressed')
#update all idle widgets (remove text box lag)
top.update_idletasks()
def mouseentry(event):
print('mouse entered text box')
#update all idle widgets (remove text box lag)
top.update_idletasks()
##text entry box
Label(top,background=bgcol, text="").pack() #spacing label
v = StringVar()
e=Entry(top, width=50, textvariable=v)#,height=1)
e.pack()
Label(top,background=bgcol, text="").pack() #spacing label
v.set("a default value")
s = e.get()
e.bind("<Key>",keypress)
e.bind("<Enter>",mouseentry)
#Label displaying text box contents (not working right now, not important)
Label(top,background=bgcol, textvariable=s).pack() #text display label
#make buttons appear on start
top.update()
top.mainloop()
如何在输入时更新条目小部件?我忽略了一些非常简单的事情吗?
【问题讨论】:
-
我没有看到任何滞后,我看不出有什么理由应该有滞后,除非您的“打印”语句非常慢。如果您将 print 语句替换为其他内容(例如:更新计数器),您还会看到滞后吗?
-
你是一个角色背后的原因在这个答案中有详细解释:stackoverflow.com/a/11542200/7432
-
我用的是anaconda3,但是通过命令行运行还是卡顿。
-
当我从事件中删除 update_idletasks 时,它根本不会更新。我认为这不是速度问题,我认为窗口只是在打字时拒绝自行刷新。删除打印语句没有区别。
-
您的系统似乎有问题。对
update_idletasks的调用应该 完全是多余的。您描述的行为是没有事件循环运行时所期望的行为,尽管您的代码显示了对mainloop的调用。由于您描述的行为非常不标准,这似乎表明您的环境中存在某些问题。
标签: user-interface python-3.x tkinter event-handling widget