У меня есть холст внутри рамки. 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()
Окно выглядит так Но возможности прокрутки с помощью полосы прокрутки
нет