【问题标题】:Why does tkinter's Entry.xview_moveto fail?为什么 tkinter 的 Entry.xview_moveto 失败?
【发布时间】:2015-03-29 20:36:43
【问题描述】:

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

【问题讨论】:

    标签: python python-3.x tkinter ttk


    【解决方案1】:

    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

    【讨论】:

    • 您不需要在事件处理程序中调用update_idletasks。调用处理程序的唯一方法是 update 刚刚运行。
    • 我是这么想的,但是当我把那条线去掉时,视图对我来说并没有移动。
    • 有趣。感谢您的回复。
    猜你喜欢
    • 1970-01-01
    • 2011-05-16
    • 2015-06-19
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多