为什么 tkinter 的 Entry.xview_moveto 会失败?
Why does tkinter's Entry.xview_moveto fail?
我在 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。
建议的答案是绑定到 Entry 的 <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。
我在 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。
建议的答案是绑定到 Entry 的 <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。