Изменение ширины столбца древовидной структуры после создания - PullRequest
0 голосов
/ 26 сентября 2018

Я хочу использовать один и тот же виджет дерева для разных отчетов.Чтобы это работало, мне нужно каждый раз изменять заголовок, прежде чем вставлять новые данные.Но я не могу заставить виджет вести себя так, как я хочу: всякий раз, когда я изменяю заголовок / ширину, пустой столбец появляется из ниоткуда.Есть ли что-то, что я могу сделать, чтобы предотвратить это, или я должен каждый раз уничтожать и воссоздавать новое дерево?

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
tree = ttk.Treeview(root, selectmode='browse')
tree.grid(row=0,column=0)
tree_header = ("One", "Two", "Three", "Four", "Five")
tree_width = (100, 100, 100, 100, 100)
tree["columns"] = tree_header
tree['show'] = 'headings'

for i in range(len(tree_header)):
    tree.column(tree_header[i],width=tree_width[i], anchor="w", stretch = False)
    tree.heading(tree_header[i], text=tree_header[i], anchor='w')
tree.insert("",tk.END,text="",value=(1,2,3,4,5))

def click_me():
    tree.delete(*tree.get_children())
    new_header = ("Six","Seven","Eight","Nine","Ten")
    new_width = (120, 80, 120, 80, 100)
    tree["columns"] = new_header
    tree['show'] = 'headings'
    for i in range(len(new_header)):
        tree.column(new_header[i],width=new_width[i],anchor="w", stretch = False)
        tree.heading(new_header[i],text=new_header[i],anchor="w")
    a_button.config(command=click_me_again)
    tree.insert("", tk.END, text="", value=(6, 7, 8, 9, 10))

def click_me_again():
    tree.delete(*tree.get_children())
    tree["columns"] = tree_header
    tree['show'] = 'headings'
    for i in range(len(tree_header)):
        tree.column(tree_header[i],width=tree_width[i],  anchor="w", stretch = False)
        tree.heading(tree_header[i], text=tree_header[i], anchor='w')
    a_button.config(command=click_me)
    tree.insert("", tk.END, text="", value=(1, 2, 3, 4, 5))

a_button = tk.Button(root,text="Click me",command=click_me)
a_button.grid(row=1,column=0)

root.mainloop()

1 Ответ

0 голосов
/ 28 сентября 2018

Этот пример немного меняет ваш.Я думаю, что для пользователя будет полезно, если Treeview расширяется вместе с его контейнером.

Но это изменение не решает проблему.

Я обнаружил, что уменьшение ширины столбца все еще оставляет виджет Treeviewс оригинальной шириной, отсюда и пробел.Затем, если я изменю размер окна, используя правую границу, и оно пройдет в правильном направлении над правой границей последнего столбца, оно поймает заголовок, а заголовки и окно снова изменят размер вместе ...

Что ясделать ниже, чтобы установить ширину контейнера (корневое окно) на расчетную ширину всех столбцов, после изменения ширины.Я также учитываю пиксели разделителя столбцов (в противном случае изменение ширины окна придется перехватывать, как описано выше):

Вы все еще можете отсоединить последний заголовок от границы окна, открывая пробел, но вы также можетезаставить минимальную ширину.И переписывание заголовков исправляет это.Я думаю, что вы также можете зафиксировать это событие и заставить ширину окна следовать, если это имеет значение.

Я не знаю, что есть более простой способ исправить это поведение, и я также не знаю, еслиэто ожидается или больше как ошибка.Если у меня есть заранее определенное количество столбцов, и я нахожусь в «заголовках», а не в «заголовках деревьев», почему лишние пробелы?

import tkinter as tk
from tkinter import ttk

def change_headers():
    global headers
    headers = (headers[0]+'A', headers[1]+'B', headers[2]+'C')
    widths = (50, 50, 50)
    tree['columns'] = headers
    for i, header in enumerate(headers):
        tree.heading(header, text=header)
        tree.column(header, width=widths[i])
    w = sum(width for width in widths) + len(widths)-1
    h = root.winfo_reqheight()
    root.wm_geometry('{}x{}'.format(w,h))
    root.update()

root = tk.Tk()
tree = ttk.Treeview(root)
button = ttk.Button(root, text='Change Headers', command=change_headers)

tree.grid(row=0, column=0, sticky=tk.NSEW)
button.grid(row=1, column=0, sticky=tk.EW)

root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)

headers = ('A', 'B', 'C')
widths = (150, 150, 150)
tree['show'] = 'headings'
tree['columns'] = headers
for i, header in enumerate(headers):
    tree.heading(header, text=header)
    tree.column(header, width=widths[i])

root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...