Приносим извинения, если на этот вопрос был дан ответ раньше, но я не могу найти ничего с этой спецификой.
Я заканчиваю создание инструмента запросов для команды, с которой работаю, где они могут выбирать поля для запроса базы данных и искать строку (наряду с другими параметрами).
Результат отправляется в виджет Tkinter TreeView (считается, что это лучший подход с точки зрения управления событиями и визуализации).
У меня есть основная проблема, заключающаяся в том, чтобы ограничить размер Treeview определенной шириной, независимо от того, сколько полей выберет пользователь. Поскольку полный графический интерфейс не масштабируется, я хочу, чтобы Treeview имел максимальный размер.
Я попытался указать ширину при определении столбцов, но, похоже, это обошлось.
Treeview является дочерним элементом LabelFrame, и его расположение определяется сеткой.
Вот пример кода того, что я делаю для установки TreeView (поскольку это приложение компании, я должен быть осторожен с раскрытием некоторых имен полей):
CoreQuery.groupResults = LabelFrame(CoreQuery.root, text = "Query Result", padx=5, pady=5, height=470,width=960)
CoreQuery.tree = ttk.Treeview(CoreQuery.groupResults, selectmode='browse')
CoreQuery.tree.bind("<Double-1>", CoreQuery.OnTreeDoubleClick)
CoreQuery.scrollbar_horizontal = ttk.Scrollbar(CoreQuery.root, orient='horizontal', command=CoreQuery.tree.xview)
CoreQuery.scrollbar_vertical = ttk.Scrollbar(CoreQuery.root, orient='vertical', command=CoreQuery.tree.yview)
CoreQuery.tree.config(height=18, xscrollcommand=CoreQuery.scrollbar_horizontal.set, yscrollcommand=CoreQuery.scrollbar_vertical.set)
CoreQuery.tree.grid(row=0, sticky = "w")
CoreQuery.scrollbar_horizontal.grid(row=1,column=0, sticky='ns')
CoreQuery.scrollbar_vertical.grid(row=0, column=2, sticky='ew')
CoreQuery.scrollbar_horizontal.configure(command=CoreQuery.tree.xview)
CoreQuery.scrollbar_vertical.configure(command=CoreQuery.tree.yview)
CoreQuery.tree.configure(yscroll=CoreQuery.scrollbar_vertical, xscroll=CoreQuery.scrollbar_horizontal)
Ниже приводится метод, который получает результат SQL-запроса и помещает данные в TreeView:
def ScreenPrintResults(header,rows):
columns=len(header)
minColumnsize=math.ceil(965/columns)
#Clear Treeview
CoreQuery.tree.delete(*CoreQuery.tree.get_children())
for values in rows:
values[0] = str(values[0]).replace(".0", "")
if (values[0].isdigit()):
values[0] = int(values[0])
auxCount=0
CoreQuery.tree['columns']=header
for value in header:
CoreQuery.tree.heading(value, text=str(value))
CoreQuery.tree.column(value, stretch=tk.NO)
for items in rows:
if auxCount==0:
CoreQuery.tree.column('#0', width=30, stretch=tk.NO)
else:
CoreQuery.tree.column(value, width=minColumnsize)
CoreQuery.tree.insert('',tk.END,auxCount+1,text=str(auxCount+1),
values=list(items))
auxCount=auxCount+1
CoreQuery.updateMessage.config(foreground = "Black", font = "Verdana 10 bold")
CoreQuery.message.set("...")
Есть ли какие-то ограничения, которые я могу добавить ширину TreeView, чтобы она не выходила за пределы определенной ширины? Или мне нужно разделить доступную ширину на количество столбцов, которые я получаю из запроса?
Честно говоря, мне все равно, отображается ли вся информация на экране, поэтому я разместил полосы прокрутки.
Спасибо за помощь!
Обновлено: изменен код цикла For и добавлены более поясняющие снимки экрана проблемы.
Вопрос решен. Оказывается, переменная размера столбца использовала фиксированную ширину, которая, по сути, является шириной приложения, поэтому оно расширялось за пределы этого размера. Поэтому для Treeview вам действительно нужно быть осторожным с размером столбца.
Пример ниже демонстрирует, как установить ширину для columns
, minwith
и maxwidth
, которые принимают integers
. Также вы можете установить высоту строки с помощью атрибута rowheight
, чтобы текст хорошо отображался в дереве.
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
tree = ttk.Treeview(root, column=("col1","col2"), show = "headings")
style = ttk.Style(root)
style.configure('my.Treeview', rowheight=50)
tree.configure(style='my.Treeview')
tree.heading("#0", text = "COMPANY NAME")
tree.heading("#1", text = "DEPARTMENT")
tree.heading("#2", text = "BRANCH")
tree.column("#0", stretch=tk.NO, minwidth=100, width=000)
tree.column("#1", stretch=tk.NO, minwidth=100, width=400)
tree.column("#2", stretch=tk.NO, minwidth=100, width=400)
tree.insert("", tk.END, values=("Am using python version 3.6.1 \n on windows machine ", "This an example Tkinter Treeview in Python, which is from \nttk class make"))
tree.insert("", tk.END, values=("This an example Tkinter Treeview in Python, which is from \nttk class make sure #import ttk\n also from tkinter import *", "Apologies if this was answered before but I cannot find "))
tree.pack()
root.mainloop()
Спасибо за вклад. Я использовал ваш код, чтобы внести несколько изменений, в основном в порядке появления заголовок-> столбец-> вставка, что, кажется, сделало его более читаемым. Проблема все еще существует с Treeview, расширяющимся за пределы LabelFrame, и я чувствую, что это связано с тем фактом, что я использую цикл for для вставки строк в Treeeview. Я добавил полосы прокрутки, но насколько я могу судить, они имеют минимальный размер, и я могу прокручивать только вверх / вниз.
если он расширяется за пределы labelframe
, минимизируйте ширину column
Возможный дубликат как-установить-ширину-древовидного-в-tkinter-оф-Python