gpt4 book ai didi

python - 如何检测 ttk.Treeview 列的大小调整?

转载 作者:太空宇宙 更新时间:2023-11-03 14:25:03 27 4
gpt4 key购买 nike

我有一个ttk.Notebook每个选项卡包含一个 ttk.Treeview 。所有 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>事件不是由列大小调整触发的。

最佳答案

按照常识建议,我对 <ButtonRelease-1> 进行了绑定(bind)检查列的大小是否已调整。如果tree.identify_region(event.x, event.y)'separator'然后是调整大小。然后我需要识别分隔符两侧的列。 tree.identify_column(event.x)给我左侧的列,格式为 '#<column number>'我可以从中获取右侧列的 id。最后,我执行调整所有树中列大小的函数。

import tkinter as tk
from tkinter import ttk

root = tk.Tk()


def on_click_release(event):
tree = event.widget
if tree.identify_region(event.x, event.y) == 'separator':
left_column = tree.identify_column(event.x)
right_column = '#%i' % (int(tree.identify_column(event.x)[1:]) + 1)
width_l = tree.column(left_column, 'width')
width_r = tree.column(right_column, 'width')
for tree2 in trees:
if tree2 != tree:
tree2.column(left_column, width=width_l)
tree2.column(right_column, width=width_r)


notebook = ttk.Notebook(root)
notebook.pack()

trees = [ttk.Treeview(notebook, columns=['a', 'b', 'c']) for i in range(4)]

for i, tree in enumerate(trees):
tree.bind('<ButtonRelease-1>', on_click_release)
notebook.add(tree, text='Tab %i' % i)

root.mainloop()

编辑:我意识到如果我们移动列分隔符太快( tree.identify_region(event.x, event.y) 不返回“分隔符”),上述方法将不起作用。所以我找到了一种不同的方法:当用户更改选项卡时,当前选项卡的每一列的宽度都设置为先前可见选项卡的相应列的宽度。

import tkinter as tk
from tkinter import ttk


def tab_changed(event):
global current_tab
tab = notebook.index('current') # get newly visible tab number
tree1 = trees[current_tab] # get previously visible tree
tree2 = trees[tab] # get newly visible tree
cols = ('#0', ) + tree1.cget('columns') # tuple of all columns
for column in cols:
tree2.column(column, width=tree1.column(column, 'width'))
current_tab = tab


root = tk.Tk()
notebook = ttk.Notebook(root)
notebook.pack()

trees = [ttk.Treeview(notebook, columns=['a', 'b', 'c']) for i in range(4)]
current_tab = 0 # store currently visible tab number

for i, tree in enumerate(trees):
notebook.bind('<<NotebookTabChanged>>', tab_changed)
notebook.add(tree, text='Tab %i' % i)

root.mainloop()

关于python - 如何检测 ttk.Treeview 列的大小调整?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47695391/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com