Anonymous
Tkinter — группировка столбцов в Treeview
Сообщение
Anonymous » 08 янв 2026, 15:07
У меня есть таблица, построенная из нескольких виджетов Label и размещенная с помощью методаgrid(). Я могу сгруппировать несколько столбцов в заголовке, используя rowspan и columnspan, чтобы организовать информацию определенным образом.
Я могу легко воспроизвести большую часть этого с помощью виджета Treeview, но я не знаю, как организовать заголовок так же, как раньше. Возможно ли это сделать?
На этом рисунке показаны обе таблицы. Синим цветом выделен заголовок, который я хотел бы воспроизвести во второй таблице.
Код, отображающий обе таблицы:
Код: Выделить всё
import tkinter as tk
from tkinter import ttk
from random import randint
COLUMNS = 10
ROWS = 5
class TableWithLabels:
def __init__(self, parent):
self.style = ttk.Style()
self.style.configure('Header.TLabel', borderwidth=1, background='#9EBDF0', relief=tk.GROOVE)
self.lbf = ttk.Labelframe(parent, text='Table with Label')
self.lbf.grid(row=0, column=0, sticky='NSWE')
self.lbf.rowconfigure(list(range(10)), weight=0)
self.lbf.columnconfigure(list(range(10)), weight=1)
# Headers definition
lbf_list_headers = [None] * (COLUMNS + 3)
lbf_list_headers[0] = ttk.Label(self.lbf, style='Header.TLabel', text="Column 0")
lbf_list_headers[1] = ttk.Label(self.lbf, style='Header.TLabel', text="Column 1")
lbf_list_headers[2] = ttk.Label(self.lbf, style='Header.TLabel', text="Column 2")
lbf_list_headers[3] = ttk.Label(self.lbf, style='Header.TLabel', text="Column 3")
lbf_list_headers[4] = ttk.Label(self.lbf, style='Header.TLabel', text="Column 4")
lbf_list_headers[5] = ttk.Label(self.lbf, style='Header.TLabel', text="Column 5")
lbf_list_headers[6] = ttk.Label(self.lbf, style='Header.TLabel', text="Column 6")
lbf_list_headers[7] = ttk.Label(self.lbf, style='Header.TLabel', text="Column 7")
lbf_list_headers[8] = ttk.Label(self.lbf, style='Header.TLabel', text="Column 8")
lbf_list_headers[9] = ttk.Label(self.lbf, style='Header.TLabel', text="Column 9")
lbf_list_headers[10] = ttk.Label(self.lbf, style='Header.TLabel', text="Group 1", anchor=tk.CENTER)
lbf_list_headers[11] = ttk.Label(self.lbf, style='Header.TLabel', text="Group 2", anchor=tk.CENTER)
lbf_list_headers[12] = ttk.Label(self.lbf, style='Header.TLabel', text="Group 3", anchor=tk.CENTER)
# Headers gridding
lbf_list_headers[0].grid(row=0, rowspan=2, column=0, sticky='NSWE')
lbf_list_headers[1].grid(row=0, rowspan=2, column=1, sticky='NSWE')
lbf_list_headers[2].grid(row=0, rowspan=2, column=2, sticky='NSWE')
# Group 1
lbf_list_headers[3].grid(row=1, column=3, sticky='NSWE')
lbf_list_headers[4].grid(row=1, column=4, sticky='NSWE')
lbf_list_headers[5].grid(row=1, column=5, sticky='NSWE')
lbf_list_headers[10].grid(row=0, column=3, columnspan=3, sticky='NSWE')
# Group 2
lbf_list_headers[6].grid(row=1, column=6, sticky='NSWE')
lbf_list_headers[7].grid(row=1, column=7, sticky='NSWE')
lbf_list_headers[11].grid(row=0, column=6, columnspan=2, sticky='NSWE')
# Group 3
lbf_list_headers[8].grid(row=1, column=8, sticky='NSWE')
lbf_list_headers[9].grid(row=1, column=9, sticky='NSWE')
lbf_list_headers[12].grid(row=0, column=8, columnspan=2, sticky='NSWE')
# Display some random data
lbf_list_data = [None] * COLUMNS
for row in range(ROWS):
for column in range(COLUMNS):
lbf_list_data[column] = ttk.Label(self.lbf, relief=tk.GROOVE, text=f"{10000 + randint(0, 2000)}")
lbf_list_data[column].grid(row=row+2, column=column, sticky='NSWE')
class TableWithTreeview:
def __init__(self, parent):
self.lbf = ttk.Labelframe(parent, text='Table with Treeview')
self.lbf.grid(row=1, column=0, sticky='NSWE')
columns = (
'Column 0', 'Column 1', 'Column 2',
'Column 3', 'Column 4', 'Column 5',
'Column 6', 'Column 7', 'Column 8',
'Column 9'
)
self.tw = ttk.Treeview(self.lbf, selectmode='browse', columns=columns, style='Custom.Treeview')
self.tw.heading('Column 0', text='Column 0')
self.tw.heading('Column 1', text='Column 1')
self.tw.heading('Column 2', text='Column 2')
self.tw.heading('Column 3', text='Column 3')
self.tw.heading('Column 4', text='Column 4')
self.tw.heading('Column 5', text='Column 5')
self.tw.heading('Column 6', text='Column 6')
self.tw.heading('Column 7', text='Column 7')
self.tw.heading('Column 8', text='Column 8')
self.tw.heading('Column 9', text='Column 9')
self.tw['show'] = 'headings'
self.tw.column('Column 0', width=100)
self.tw.column('Column 1', width=100)
self.tw.column('Column 2', width=100)
self.tw.column('Column 3', width=100)
self.tw.column('Column 4', width=100)
self.tw.column('Column 5', width=100)
self.tw.column('Column 6', width=100)
self.tw.column('Column 7', width=100)
self.tw.column('Column 8', width=100)
self.tw.column('Column 9', width=100)
# Display some random data
lbf_list_data = [None] * COLUMNS
for row in range(ROWS):
values = []
for column in range(COLUMNS):
values.append(f"{10000 + randint(0, 2000)}")
lbf_list_data[column] = self.tw.insert('', 'end', values=values)
self.tw.grid(row=0, column=0)
window = tk.Tk()
table_1 = TableWithLabels(window)
table_2 = TableWithTreeview(window)
window.mainloop()
Я использую Python 3.13.7, хотя это, вероятно, не имеет значения.
Подробнее здесь:
https://stackoverflow.com/questions/798 ... n-treeview
1767874038
Anonymous
У меня есть таблица, построенная из нескольких виджетов Label и размещенная с помощью методаgrid(). Я могу сгруппировать несколько столбцов в заголовке, используя rowspan и columnspan, чтобы организовать информацию определенным образом. Я могу легко воспроизвести большую часть этого с помощью виджета Treeview, но я не знаю, как организовать заголовок так же, как раньше. Возможно ли это сделать? На этом рисунке показаны обе таблицы. Синим цветом выделен заголовок, который я хотел бы воспроизвести во второй таблице. [img]https://i.sstatic.net/zQOtXY5n.png[/img] Код, отображающий обе таблицы: [code]import tkinter as tk from tkinter import ttk from random import randint COLUMNS = 10 ROWS = 5 class TableWithLabels: def __init__(self, parent): self.style = ttk.Style() self.style.configure('Header.TLabel', borderwidth=1, background='#9EBDF0', relief=tk.GROOVE) self.lbf = ttk.Labelframe(parent, text='Table with Label') self.lbf.grid(row=0, column=0, sticky='NSWE') self.lbf.rowconfigure(list(range(10)), weight=0) self.lbf.columnconfigure(list(range(10)), weight=1) # Headers definition lbf_list_headers = [None] * (COLUMNS + 3) lbf_list_headers[0] = ttk.Label(self.lbf, style='Header.TLabel', text="Column 0") lbf_list_headers[1] = ttk.Label(self.lbf, style='Header.TLabel', text="Column 1") lbf_list_headers[2] = ttk.Label(self.lbf, style='Header.TLabel', text="Column 2") lbf_list_headers[3] = ttk.Label(self.lbf, style='Header.TLabel', text="Column 3") lbf_list_headers[4] = ttk.Label(self.lbf, style='Header.TLabel', text="Column 4") lbf_list_headers[5] = ttk.Label(self.lbf, style='Header.TLabel', text="Column 5") lbf_list_headers[6] = ttk.Label(self.lbf, style='Header.TLabel', text="Column 6") lbf_list_headers[7] = ttk.Label(self.lbf, style='Header.TLabel', text="Column 7") lbf_list_headers[8] = ttk.Label(self.lbf, style='Header.TLabel', text="Column 8") lbf_list_headers[9] = ttk.Label(self.lbf, style='Header.TLabel', text="Column 9") lbf_list_headers[10] = ttk.Label(self.lbf, style='Header.TLabel', text="Group 1", anchor=tk.CENTER) lbf_list_headers[11] = ttk.Label(self.lbf, style='Header.TLabel', text="Group 2", anchor=tk.CENTER) lbf_list_headers[12] = ttk.Label(self.lbf, style='Header.TLabel', text="Group 3", anchor=tk.CENTER) # Headers gridding lbf_list_headers[0].grid(row=0, rowspan=2, column=0, sticky='NSWE') lbf_list_headers[1].grid(row=0, rowspan=2, column=1, sticky='NSWE') lbf_list_headers[2].grid(row=0, rowspan=2, column=2, sticky='NSWE') # Group 1 lbf_list_headers[3].grid(row=1, column=3, sticky='NSWE') lbf_list_headers[4].grid(row=1, column=4, sticky='NSWE') lbf_list_headers[5].grid(row=1, column=5, sticky='NSWE') lbf_list_headers[10].grid(row=0, column=3, columnspan=3, sticky='NSWE') # Group 2 lbf_list_headers[6].grid(row=1, column=6, sticky='NSWE') lbf_list_headers[7].grid(row=1, column=7, sticky='NSWE') lbf_list_headers[11].grid(row=0, column=6, columnspan=2, sticky='NSWE') # Group 3 lbf_list_headers[8].grid(row=1, column=8, sticky='NSWE') lbf_list_headers[9].grid(row=1, column=9, sticky='NSWE') lbf_list_headers[12].grid(row=0, column=8, columnspan=2, sticky='NSWE') # Display some random data lbf_list_data = [None] * COLUMNS for row in range(ROWS): for column in range(COLUMNS): lbf_list_data[column] = ttk.Label(self.lbf, relief=tk.GROOVE, text=f"{10000 + randint(0, 2000)}") lbf_list_data[column].grid(row=row+2, column=column, sticky='NSWE') class TableWithTreeview: def __init__(self, parent): self.lbf = ttk.Labelframe(parent, text='Table with Treeview') self.lbf.grid(row=1, column=0, sticky='NSWE') columns = ( 'Column 0', 'Column 1', 'Column 2', 'Column 3', 'Column 4', 'Column 5', 'Column 6', 'Column 7', 'Column 8', 'Column 9' ) self.tw = ttk.Treeview(self.lbf, selectmode='browse', columns=columns, style='Custom.Treeview') self.tw.heading('Column 0', text='Column 0') self.tw.heading('Column 1', text='Column 1') self.tw.heading('Column 2', text='Column 2') self.tw.heading('Column 3', text='Column 3') self.tw.heading('Column 4', text='Column 4') self.tw.heading('Column 5', text='Column 5') self.tw.heading('Column 6', text='Column 6') self.tw.heading('Column 7', text='Column 7') self.tw.heading('Column 8', text='Column 8') self.tw.heading('Column 9', text='Column 9') self.tw['show'] = 'headings' self.tw.column('Column 0', width=100) self.tw.column('Column 1', width=100) self.tw.column('Column 2', width=100) self.tw.column('Column 3', width=100) self.tw.column('Column 4', width=100) self.tw.column('Column 5', width=100) self.tw.column('Column 6', width=100) self.tw.column('Column 7', width=100) self.tw.column('Column 8', width=100) self.tw.column('Column 9', width=100) # Display some random data lbf_list_data = [None] * COLUMNS for row in range(ROWS): values = [] for column in range(COLUMNS): values.append(f"{10000 + randint(0, 2000)}") lbf_list_data[column] = self.tw.insert('', 'end', values=values) self.tw.grid(row=0, column=0) window = tk.Tk() table_1 = TableWithLabels(window) table_2 = TableWithTreeview(window) window.mainloop() [/code] Я использую Python 3.13.7, хотя это, вероятно, не имеет значения. Подробнее здесь: [url]https://stackoverflow.com/questions/79863288/tkinter-column-grouping-in-treeview[/url]