Astha Sharma
Astha Sharma

Reputation: 13

Scrollable canvas having lines and buttons in tkinter

I want to have a horizontal scrollbar for a canvas in tkinter. My canvas has both buttons and lines. When I use canvas inbuilt scrollbar it only scrolls the lines not the buttons. So for the buttons I tried using this function which shifts the position of buttons whenever the scrollbar is moved. But now the problem is that buttons and lines move with a different speed according to the width of the scrollbar. The scrollbar gives relative coordinates for its ends but I need absolute coordinates otherwise it disturbs the dragging feature of the buttons and lines. I have been stuck on this for a week now and can't figure out anything useful. Tried almost everything on stackoverflow.

    Toplevel1.hbar = ttk.Scrollbar(panel_2, orient="horizontal")
    self.SystemCanvas.configure(scrollregion = (0, 0, 1000, 1000),
                                xscrollcommand = Toplevel1.hbar.set)
    Toplevel1.hbar['command'] = self.SystemCanvas.xview
    Toplevel1.hbar.bind('<B1-Motion>', lambda e:hscrollBarMove(e,
                            Toplevel1.hbar, self.SystemCanvas))
    Toplevel1.hbar.pack(side = "bottom", fill = "x")

def hscrollBarMove(event, hbar, systemcanvas):
    for instance in systemcanvas.winfo_children():
        if isinstance(instance, tk.Button) or isinstance(instance, tk.Menu):
            try:
                instance.place(relx = - hbar.get()[0])
            except:
                pass

Buttons and lines come dynamically. Please someone help me :(

Upvotes: 0

Views: 363

Answers (1)

Bryan Oakley
Bryan Oakley

Reputation: 386220

My canvas has both buttons and lines. When I use canvas inbuilt scrollbar it only scrolls the lines not the buttons.

Yes, that is correct. The canvas can only scroll canvas objects -- objects created with the various create_* methods (create_line, create_window, etc). It won't scroll items added to the canvas with place, pack, or grid.

If you want to put buttons on a canvas and have them be scrollable, use create_window to add them to the canvas.

Upvotes: 1

Related Questions