• TkInter Scrolled Listbox class?

    From Ulrich Goebel@21:1/5 to All on Mon Nov 4 16:32:48 2024
    Hi,

    I would like to build a class ScrolledListbox, which can be packed somewhere in ttk.Frames. What I did is to build not really a scrolled Listbox but a Frame containing a Listbox and a Scrollbar:

    class FrameScrolledListbox(ttk.Frame):
    def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    #
    # build Listbox and Scrollbar
    self.Listbox = tk.Listbox(self)
    self.Scrollbar = ttk.Scrollbar(self)
    #
    # configure these two
    self.Listbox.config(yscrollcommand=self.Scrollbar.set)
    self.Scrollbar.config(command=self.Listbox.yview)
    #
    # pack them in Frame
    self.Listbox.pack(side=tk.LEFT, fill=tk.BOTH)
    self.Scrollbar.pack(side=tk.RIGHT, fill=tk.BOTH)

    That works, so instances of FrameScrolledListbox can be packed and the tk.Listbox itself is accessible via an attribute:

    frmScrolledListbox = FrameScrolledListbox(main) frmScrolledListbox.Listbox.config(...)

    But it would be a bit nicer to get a class like

    class ScrolledListbox(tk.Listbox):
    ...

    So it would be used that way:

    scrolledListbox = ScrolledListbox(main)
    scrolledListbox.config(...)

    Is that possible? The problem which I can't handle is to handle the Frame which seems to be needed to place the Scrollbar somewhere.

    Best regards
    Ulrich


    --
    Ulrich Goebel <ml@fam-goebel.de>

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Cameron Simpson@21:1/5 to Ulrich Goebel on Tue Nov 5 08:21:28 2024
    On 04Nov2024 16:32, Ulrich Goebel <ml@fam-goebel.de> wrote:
    I would like to build a class ScrolledListbox, which can be packed
    somewhere in ttk.Frames. What I did is to build not really a scrolled
    Listbox but a Frame containing a Listbox and a Scrollbar:

    That's what I would build too.

    class FrameScrolledListbox(ttk.Frame):
    def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    # build Listbox and Scrollbar
    self.Listbox = tk.Listbox(self)
    self.Scrollbar = ttk.Scrollbar(self)
    [...]
    But it would be a bit nicer to get a class like

    class ScrolledListbox(tk.Listbox):
    ...

    So it would be used that way:

    scrolledListbox = ScrolledListbox(main)
    scrolledListbox.config(...)

    Probably you want to proxy various methods to the enclosed widgets.
    Possibly you want to do that with parameters in `__init__` also.

    Example:

    class FrameScrolledListbox(ttk.Frame):
    def __init__(self, *frame_args, *, height=None, jump=None, **frame_kw):
    super().__init__(*frame_args, **frame_kw)
    self.Listbox = tk.Listbox(self, height=height)
    self.Scrollbar = ttk.Scrollbar(self, jump=jump)
    ........

    def config(self, *a, **kw):
    return self.Listbox.config(*a, **kw)

    and so forth for the various listbox methods you want to proxy to the
    listbox itself. You could pass scroll specific methods to the scrollbar
    as well.

    Cheers,
    Cameron Simpson <cs@cskk.id.au>

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)