重新定位滚动列表以将新创建​​的项目放在顶部

时间:2015-09-03 21:40:23

标签: python tkinter

我的模型是一个或多或少复杂对象的列表。我的视图显示了一个行列表,每个对象一个。每行显示相应对象的几个标识属性。列表很长,所以我有一个滚动条。

要编辑一个对象,用户点击相应的行,然后行#34;展开"到编辑器(它仍然是行列表的一部分)。即,我没有弹出一个对话框,只是用一个更复杂的小部件替换了简单的行。

我这样做的方法是grid.forget旧小部件,在同一行创建编辑器小部件和.grid。这没有问题。

除此之外,我还想确保编辑器窗口小部件完全可见(即使窗口中的行非常低)。为此,我想滚动列表,以便编辑器小部件位于可见区域的顶部。这是一些伪代码:

# find the clicked row
...

# get rid of the old widget
w = self.widgets[row]
w.grid_forget()
w.destroy()

# create the editor widget and .grid it in place
w = Editor(...)
w.grid(row=row, ...)

# find the editor y-position and scroll so that it is on
# the upper edge of the viewing area
y = w.winfo_y()
scrollcanvas.yview('moveto', 0.0)
scrollcanvas.yview('scroll', y, 'units') # units are pixels

这不起作用。当我打印y时,我得到零。我相信这是因为 winfo_y返回的位置尚未更新,因为Tkinter异步更新这些内容。但我不知道该怎么办,除了一些恶心的黑客,例如找到y作为前一行的位置加上它的高度(aaaak !!!)

将滚动延迟到编辑器'配置'事件帮助?

0 个答案:

没有答案