холст tkinter с полосами прокрутки X и Y, не отображающими полосу прокрутки y или рамку заполнения с помощью CheckboxTreeview - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь получить CheckboxTreeview для отображения во фрейме с полосами прокрутки x и y, используя информацию из сообщения в блоге здесь https://blog.tecladocode.com/tkinter-scrollable-frames/ об использовании холста для создания полос прокрутки.

import tkinter as tk
from tkinter import ttk
from ttkwidgets import CheckboxTreeview
import sqlite3

INSERT_TRAIT = "INSERT into evaluation_trait_table (trait_name, trait_type, evaluation_trait_display_order) values (?, ?, ?);"

def add_trait(connection, trait_name, trait_type, evaluation_trait_display_order):
    with connection:
        connection.execute(INSERT_TRAIT, (trait_name, trait_type, evaluation_trait_display_order))

class ScrollableFrame(ttk.Frame):
    def __init__(self, container, *args, **kwargs):
        super().__init__(container, *args, **kwargs)
        canvas = tk.Canvas(self, width=500, height=300)
        yscrollbar = ttk.Scrollbar(self, orient="vertical", command=canvas.yview)
        xscrollbar = ttk.Scrollbar(self, orient="horizontal", command=canvas.xview)
        self.scrollable_frame = ttk.Frame(canvas)
        self.scrollable_frame.bind("<Configure>", lambda e: canvas.configure(scrollregion=canvas.bbox("all")))
        canvas.create_window((0, 0), window=self.scrollable_frame, anchor="nw")
        canvas.configure(yscrollcommand=yscrollbar.set)
        canvas.configure(xscrollcommand=xscrollbar.set)
        yscrollbar.pack(side="right", fill="y")
        xscrollbar.pack(side="bottom", fill="x")
        canvas.pack(side="left", fill="both", expand=True)

root = tk.Tk()
root.columnconfigure(0, weight=1)
root.rowconfigure(1, weight=1)
connection = sqlite3.connect('treeview_test_db.sqlite')

cmd = "CREATE TABLE if not exists evaluation_trait_table (id INTEGER PRIMARY KEY ,trait_name CHAR NOT NULL " \
             ",trait_type INTEGER,evaluation_trait_display_order INTEGER DEFAULT (null) ) "
connection.execute(cmd)
add_trait(connection,'Teeth Alignment', 1, 38)
add_trait(connection,'Missing Teeth', 1, 31)
add_trait(connection,'White on Nose', 1, 44)
add_trait(connection,'Head', 1, 21)
add_trait(connection,'Horn Shape', 1, 24)
add_trait(connection,'Body', 1, 3)
add_trait(connection,'Legs', 1, 27)
add_trait(connection,'White in Britch or Body', 1, 43)
add_trait(connection,'White on Nose', 1, 44)
add_trait(connection,'Udder Lumps', 1, 40)
add_trait(connection,'Fleece Quality', 1, 18)
add_trait(connection,'Fleece Soft', 1, 19)
add_trait(connection,'Fleece Length', 2, 17)
add_trait(connection,'Fleece Weight', 2, 20)
add_trait(connection,'Scrotal Circumference', 2, 35)
add_trait(connection,'Weight', 2, 42)
add_trait(connection,'Horn Buds', 1, 23)
add_trait(connection,'Temperament', 1, 39)
add_trait(connection,'Fleece Crimp', 1, 16)
add_trait(connection,'Insemination Depth', 2, 25)

my_frame = ScrollableFrame(root)
tree = CheckboxTreeview(my_frame.scrollable_frame
                        , column=("column1", "column2", "column3", "column4"), show=("headings", "tree"))
tree.heading("#0", text="Select")
tree.column("#0", minwidth=50, width=50)
tree.heading("#1", text="id_traitid")
tree.column("#1", minwidth=75, width=75)
tree.heading("#2", text="Trait Name")
tree.column("#2", minwidth=150, width=150)
tree.heading("#3", text="trait_type")
tree.column("#3", minwidth=150, width=150)
tree.heading("#4", text="evaluation_trait_display_order")
tree.column("#4", minwidth=150, width=150)
connection = sqlite3.connect('treeview_test_db.sqlite')
cursor = connection.cursor()
cmd = "select * from evaluation_trait_table"
cursor.execute(cmd)
rows = cursor.fetchall()
for row in rows:
    print(row)
    tree.insert('', 'end', values=row)
tree.pack()
my_frame.grid(row=0, column=0)

my_header_label = tk.Label(root, text='The frame below works properly with 2 scrollbars and fills the blank space in the canvas.', bg="white")
my_header_label.grid(row=1, column=0)

frame2 = ScrollableFrame(root)
frame2.grid(row=2, column=0)
for i in range(50):
    ttk.Label(frame2.scrollable_frame, text="Sample scrolling label that is really long to "
                                           "test if my 2 way scrolling works", width=900).pack()
frame3 = ScrollableFrame(root)
frame3.grid(row=2, column=1)
for i in range(50):
    ttk.Label(frame3.scrollable_frame, text="This is a second scrolling frame that I have gridded "
                                            "elsewhere. It is also a very long line to verify that the horixntal scrolling works.").pack()

root.mainloop()

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

Вторая проблема заключается в том, что древовидное представление не заполняет фрейм по вертикали, тогда как фреймы, сделанные с меткой в ​​al oop, делают заполните и прокрутите правильно.

Есть ли у кого-нибудь идеи, почему древовидное представление не работает и как это исправить?

1 Ответ

1 голос
/ 09 июля 2020

Это потому, что значение по умолчанию для опции height древовидного представления равно 10, поэтому будут показаны только 10 строк. Установите для параметра height количество строк после вставки в него всех данных:

...
rows = cursor.fetchall()
for row in rows:
    print(row)
    tree.insert('', 'end', values=row)
tree.config(height=len(rows))
tree.pack()
...
...