【发布时间】:2017-12-07 12:40:59
【问题描述】:
我有一个ttk.Notebook,每个选项卡都包含一个ttk.Treeview。所有树视图都有相同的列,但包含不同的项目,如下面的代码所示。
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
notebook = ttk.Notebook(root)
notebook.pack()
tree1 = ttk.Treeview(notebook, columns=['a', 'b', 'c'])
tree1.insert('', 'end', text='item1', values=('a1', 'b1', 'c1'))
tree2 = ttk.Treeview(notebook, columns=['a', 'b', 'c'])
tree2.insert('', 'end', text='item2', values=('a2', 'b2', 'c2'))
tree2.insert('', 'end', text='item2', values=('a2', 'b2', 'c2'))
notebook.add(tree1, text='Tab 1')
notebook.add(tree2, text='Tab 2')
root.mainloop()
我希望所有树始终具有相同的列宽。因此,例如,当用户调整tree1 的“a”列的大小时,tree2 的“a”列也应该调整大小。
我知道我可以通过
tree1.column('a', 'width') 并将其设置为 tree2.column('a', width=300)。
但是我怎样才能检测到列的大小发生了变化呢?
我检查了 treeview <Configure> 事件不是由调整列大小触发的。
【问题讨论】:
-
如果您只关心用户交互,您可以将回调绑定到
<B1-Motion>事件并检查identify_region(event.x, event.y)。如果它返回'separator'- 之后通过identify_column(event.x)和width获取列的iid。创建一个函数,它将遍历具有指定宽度的指定小部件的所有列。如果您以编程方式更改width- 只需调用该函数。如果它通过用户更改 -<B1-Motion>应该处理它。 -
是的,这看起来是个好主意。但是,我不知道它对性能的影响有多大,以及
treeview的响应速度如何,显然这取决于实现。但是,另一种选择是使用相同的逻辑绑定到<ButtonRelease-1>,以防止可能的性能问题。 -
用
ttk::treeview::Press解决这个问题可能会很有趣。