我的模型是一个或多或少复杂对象的列表。我的视图显示了一个行列表,每个对象一个。每行显示相应对象的几个标识属性。列表很长,所以我有一个滚动条。
要编辑一个对象,用户点击相应的行,然后行#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 !!!)
将滚动延迟到编辑器'配置'事件帮助?