我正在Python 3.4.1(Windows 7)上使用tkinter,但发现ttk的Entry.xview_moveto函数无法正常工作。这是一些简单的代码:
from tkinter import *
from tkinter import ttk
a = Tk()
text = StringVar(a, value='qwertyuiopasdfghjklzxcvbnm1234567890')
b = ttk.Entry(a, textvariable=text)
b.grid()
b.xview_moveto(1)
xview_moveto函数应将文本一直滚动到最左边,但不是。但是,我注意到如果我使用
b.after(500, b.xview_moveto, 1)
它工作正常。为什么我必须延迟函数调用才能使其正常工作?难道我做错了什么?
更新:除了fhdrsdg的解决方案之外,我还发现
Entry.after_idle
方法适用于我的程序。对于上面的简单示例,它似乎不起作用,但是,如果其他人遇到与我相同的问题,则这可能是另一种看上去更干净的解决方案。 最佳答案
tcl/Tk中也存在此问题。
此处提出的答案是绑定(bind)到Entry的<Expose>
事件,然后将其解除绑定(bind)。我试图将其重写为Python/tkinter:
def xview_event_handler(e):
e.widget.update_idletasks()
e.widget.xview_moveto(1)
e.widget.unbind('<Expose>')
a = Tk()
text = StringVar(a, value='qwertyuiopasdfghjklzxcvbnm1234567890')
b = ttk.Entry(a, textvariable=text)
b.grid()
b.bind('<Expose>', xview_event_handler)
似乎需要
update_idletasks
when using a tcl version below 8.5.5。