mardi 10 août 2021

Python Tkinter Scrollbar and Frame not showing all Checkboxes

having an issue with some tkinter code and I believe I am just too close to it and can't see the issue in front of my face. I am loading checkboxes into a frame and attaching a scrollbar to that location.

This works well until I get to a little over 1000 checkboxes. It then seems to cut off and even though the frame extends a height appropriate for all checkboxes it is not showing them in the gui. You can see in the image here where they stop showing Checkbox Malfunction

Here is my code: (Please excuse how messy it looks, it is a subset of a much larger code set, I've just isolated the error)

from tkinter import *


build_vars = {}
build_Radios = []
parent = Tk()

center_container = Frame(parent, width=5, height=5)
center_container.grid(row=1, sticky="nsew")

# Center Row Columns
center_center_container = Frame(center_container, width=150, height=200)
center_center_container.grid(row=0, column=2, sticky="ns")

build_canvas = Canvas(center_center_container, background='green')
build_canvas.grid(row=0, column=0, sticky=N+E+W+S)

# Create a vertical scrollbar linked to the canvas.
vsbar = Scrollbar(center_center_container, orient=VERTICAL, command=build_canvas.yview)
vsbar.grid(row=0, column=1, sticky=NS)
build_canvas.configure(yscrollcommand=vsbar.set)

# Create a frame on the canvas to contain the buttons.
frame_buttons = Frame(build_canvas, bd=2, background='red')

def create_build_radios():

    # for index, item in enumerate(filtered_builds):
    for index, item in enumerate(list(range(3000))):
        build_vars[item] = IntVar()
        radio = Checkbutton(frame_buttons, text=item, variable=build_vars[item], onvalue=1,
                        offvalue=0,
                        command=lambda item=item: sel(item))
        radio.grid(row=index, column=0, sticky=W)
        build_Radios.append(radio)

    # Create canvas window to hold the buttons_frame.
    build_canvas.create_window((0, 0), window=frame_buttons, anchor=NW)
    build_canvas.update_idletasks()  # Needed to make bbox info available.
    bbox = build_canvas.bbox(ALL)  # Get bounding box of canvas with Buttons.
    build_canvas.configure(scrollregion=bbox, width=150, height=400)

def sel(item):
    print(item)

create_build_radios()
parent.mainloop()



Aucun commentaire:

Enregistrer un commentaire