Python Tkinter Treeview фиксированной ширины с переменным SQL-запросом

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

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

Результат отправляется в виджет 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, чтобы она не выходила за пределы определенной ширины? Или мне нужно разделить доступную ширину на количество столбцов, которые я получаю из запроса?

Честно говоря, мне все равно, отображается ли вся информация на экране, поэтому я разместил полосы прокрутки.

Вот скриншоты проблемы: Python Tkinter Treeview фиксированной ширины с переменным SQL-запросомPython Tkinter Treeview фиксированной ширины с переменным SQL-запросом

Спасибо за помощь!

Обновлено: изменен код цикла For и добавлены более поясняющие снимки экрана проблемы.

Возможный дубликат как-установить-ширину-древовидного-в-tkinter-оф-Python

stovfl 25.10.2018 14:38

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

Leonel Serra 26.10.2018 12:46
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
1 109
1

Ответы 1

Пример ниже демонстрирует, как установить ширину для 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. Я добавил полосы прокрутки, но насколько я могу судить, они имеют минимальный размер, и я могу прокручивать только вверх / вниз.

Leonel Serra 26.10.2018 09:53

если он расширяется за пределы labelframe, минимизируйте ширину column

AD WAN 26.10.2018 14:49

Другие вопросы по теме