为什么tkinter的Entry.xview_move失败?

时间:2015-03-29 20:36:44

标签: python python-3.x tkinter ttk

我在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方法适用于我的程序。它似乎不适用于上述简单示例,但如果其他人遇到与我相同的问题,这可能是另一种更清洁的解决方案。

1 个答案:

答案 0 :(得分:2)

tcl/Tk中也存在此问题 提出的答案是绑定条目的<Expose>事件并在之后取消绑定。我试图将其重写为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