Проблема с расширением столбца в Python Tkinter

#python #tkinter #treeview #scrollbar

#python #tkinter #просмотр дерева #полоса прокрутки

Вопрос:

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

Если элемент не помещается внутри дерева, должна активироваться горизонтальная полоса прокрутки под Treeview, и она должна позволить пользователю перемещать содержимое столбца в одну из левых или правых сторон.

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

Подводя итог, в следующем фрагменте кода есть две проблемы, от которых я отказался, пытаясь найти различные решения, доступные в Интернете,

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

(2) Когда я использую stretch=tk.ДА, для просмотра дерева, чтобы заставить полосу прокрутки работать, обновление метки progressbar (Текст) заставляет treeview расширяться без причины.

Любая помощь для решения обеих проблем вместе очень ценится. Я использую Python 3.8.6 (64-разрядный) / Tkinter 8.6.9 на компьютере с Win10.

 import tkinter as tk
from tkinter import ttk

class TreeviewTest(ttk.Frame):
    def __init__(self, container, controller):
        super().__init__(container)
        self.list_num = ttk.Treeview(self, columns=("N"), show="tree headings", 
                                     height=20, selectmode="none")
        self.list_num.heading(text="#", column=0, anchor=tk.W)
        self.list_num["show"] = "headings"
        self.list_num.column("#1",width=30 , minwidth=35, stretch=tk.YES)
        self.refresh_csv_list()
        self.list_num.grid(row=0, column=0, sticky="ew")

        self.text = tk.Label(self, text="Sometext")
        self.text.grid(row=0, column=1)

        self.value = tk.DoubleVar()
        self.style = ttk.Style()
        self.style.layout("text.Horizontal.TProgressbar", 
            [("Horizontal.Progressbar.trough",
            {"children": [("Horizontal.Progressbar.pbar",
                            {"side": "left", "sticky": "ns"})],
                "sticky": "nswe"}),
            ("Horizontal.Progressbar.label", {"sticky": ""})])

        self.h_list_num_scrollbar = ttk.Scrollbar(self, orient=tk.HORIZONTAL, command=self.list_num.xview)
        self.h_list_num_scrollbar.grid(row=1, column=0, sticky="ew", columnspan=1)
        self.list_num.configure(xscrollcommand = self.h_list_num_scrollbar.set)

        self.pbar = ttk.Progressbar(self, orient="horizontal", length=300, maximum =100, 
                                    variable=self.value, style="text.Horizontal.TProgressbar")
        self.pbar.grid(row=2, column=0, sticky="EW", pady=8, padx=3, columnspan=3)
        
        self.update_progressbar(reset=True)
        self.increment()

    def increment(self):
        self.update_progressbar(amount = 0.5)
        self.after(20, self.increment)        
        
    def update_progressbar(self, amount=0, reset=False):
        if reset:
            new_value = 0
        else:
            new_value = self.value.get()   amount
            if new_value < 0:
                new_value = 0
            if new_value > 100:
                new_value = 100
        self.value.set(new_value)        
        self.style.configure(style="text.Horizontal.TProgressbar", 
                             text="{:.1f} %".format(self.value.get()))        
        

    def refresh_csv_list(self):
        for i in range(50001000,50009000):
            tg_num = f"tg_n__{i}"
            self.list_num.insert("",i, text="",values=(str(i),) , tags=(tg_num,))


class MainPage(tk.Tk):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.minsize(250,250)        
        self.title("Isolated GUI")
        self.frames = dict()

        container = ttk.Frame(self)
        container.grid(padx=10, pady=10)
        container.columnconfigure(0, weight=1)        
        
        frame_tree_view = TreeviewTest(container, self)
        self.frames[TreeviewTest] = frame_tree_view
        frame_tree_view.grid(row=0, column=0, sticky="NSEW")
        self.show_frame(TreeviewTest)
    

    def show_frame(self, container):
        frame = self.frames[container]
        frame.tkraise()


root = MainPage()
root.mainloop()