полоса прокрутки tkinter для определенного кадра - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть холст внутри рамки. Canvas больше, чем Frame, поэтому пользователь может перемещать холст с помощью ButtonPress-1. Но я хочу, чтобы пользователь также мог перемещать этот холст с помощью полос прокрутки. Я пытался создать полосу прокрутки для этого кадра, но он не работает правильно. Что я делаю не так и как должен выглядеть код полосы прокрутки?

from tkinter import *
from tkinter import ttk

class MainWindow():
    def __init__(self, root):
        # First I define width and height of my future canvas
        canvas_width = 700  # will be set by USER
        canvas_height = 500 # will be set by USER
        self.root = root
        self.canvas_width = canvas_width
        self.canvas_height = canvas_height

        # For canvas scrollbar I need to have the Frame as a parent
        # (So actually I will create scrollbar for Frame, not for canvas
        # but the canvas will move)
        self.main_frame = Frame(root, relief=GROOVE, width=600, height=500, bd=2)
        self.main_frame.pack()
        self.main_frame_canvas = Canvas(self.main_frame, width=600, height=500, bg='bisque')
        self.main_frame_canvas.pack(side=LEFT, expand=True, fill=BOTH)

        # Now creating scrollbars
        scroll_x = Scrollbar(self.main_frame, orient=HORIZONTAL)
        scroll_x.pack(side=BOTTOM, fill=X, expand=True)
        scroll_x.config(command=self.main_frame_canvas.xview)
        scroll_y = Scrollbar(self.main_frame, orient=VERTICAL)
        scroll_y.pack(side=RIGHT, expand=True, fill=Y)
        scroll_y.config(command=self.main_frame_canvas.yview)
        self.main_frame_canvas.config(xscrollcommand=scroll_x.set, yscrollcommand=scroll_y.set)
        self.main_frame_canvas.pack(side=LEFT, expand=True, fill=BOTH)



        self.main_frame_canvas.bind("<ButtonPress-1>", self.scroll_start)
        self.main_frame_canvas.bind("<B1-Motion>", self.scroll_move)

        # execute functions:
        self.grid(self.main_frame_canvas, canvas_width, canvas_height)


    def grid(self, main_frame_canvas, canvas_width, canvas_height):
        for line in range(0, canvas_width, 10):
            main_frame_canvas.create_line([(line, 0), (line, canvas_height)], fill='#d9d9d9')
        for line in range(0, canvas_width, 10):
            main_frame_canvas.create_line([(0, line), (canvas_width, line)], fill='#d9d9d9')

    def scroll_start(self, event):
        self.main_frame_canvas.scan_mark(event.x, event.y)

    def scroll_move(self, event):
        self.main_frame_canvas.scan_dragto(event.x, event.y, gain=1)

if __name__ == '__main__':
    root = Tk()
    root.geometry('900x700')
    MainWindow(root)
    root.title('Main window')
    root.mainloop()

Окно выглядит так Но возможности прокрутки с помощью полосы прокрутки

нет
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...