我正在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

10-02 11:19
查看更多