【问题标题】:Tkinter entry widget lags while typing. How to update typed text in real time?打字时 Tkinter 条目小部件滞后。如何实时更新输入的文本?
【发布时间】: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


【解决方案1】:

回答自己的问题:

无论出于何种原因,无论是通过 Anaconda 还是通过终端运行,Mainloop 都没有在我的 python 安装的后台(或其他东西)中运行。

使用 python3.4 简单地重新安装 Anaconda IDE 解决了我的所有问题。

【讨论】:

  • 您问题中的代码显示您明确调用mainloop,因此您的解释令人费解。不过,我很高兴重新安装修复了它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-02
相关资源
最近更新 更多