Методы холста используются для прокрутки холста способами xview
и yview
. Это те же самые методы, которые вы используете для подключения полос прокрутки к холсту. Вы можете прокручивать «единицы» или «страницы». «Единицы» определяются опциями холста xscrollincrement
и yscrollincrement
.
События, которые вы хотите связать, это <Up>
, <Down>
, <Left>
и <Right>
.
Собирает вместе, вы можете создать привязки, которые выглядят примерно так:
self.canvas.bind("<Left>", lambda event: self.canvas.xview_scroll(-1, "units"))
self.canvas.bind("<Right>", lambda event: self.canvas.xview_scroll(1, "units"))
self.canvas.bind("<Up>", lambda event: self.canvas.yview_scroll(-1, "units"))
self.canvas.bind("<Down>", lambda event: self.canvas.yview_scroll(1, "units"))
Вы должны убедиться, что полотно имеет фокус. Вы можете явно дать ему фокус, но вы, вероятно, также хотят мыши, чтобы сфокусировать внимание на холст, а также:
self.canvas.focus_set()
self.canvas.bind("<1>", lambda event: self.canvas.focus_set())
Вот полный рабочий пример:
import Tkinter as tk
import random
class Example(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
self.canvas = tk.Canvas(self, background="bisque")
self.vsb = tk.Scrollbar(self, orient="vertical", command=self.canvas.yview)
self.hsb = tk.Scrollbar(self, orient="horizontal", command=self.canvas.xview)
self.canvas.configure(xscrollcommand=self.hsb.set, yscrollcommand=self.vsb.set)
self.canvas.grid(row=0, column=0, sticky="nsew")
self.vsb.grid(row=0, column=1, sticky="ns")
self.hsb.grid(row=1, column=0, sticky="ew")
self.grid_rowconfigure(0, weight=1)
self.grid_columnconfigure(0, weight=1)
for i in range(100):
x = random.randint(0, 1000)
y = random.randint(0, 1000)
width = random.randint(10, 50)
height = random.randint(10, 50)
fill = random.choice(("red", "orange", "yellow", "green", "blue", "violet"))
self.canvas.create_rectangle(x, y, x+width, y+height, fill=fill)
self.canvas.configure(scrollregion = self.canvas.bbox("all"))
self.canvas.bind("<1>", lambda event: self.canvas.focus_set())
self.canvas.bind("<Left>", lambda event: self.canvas.xview_scroll(-1, "units"))
self.canvas.bind("<Right>", lambda event: self.canvas.xview_scroll(1, "units"))
self.canvas.bind("<Up>", lambda event: self.canvas.yview_scroll(-1, "units"))
self.canvas.bind("<Down>", lambda event: self.canvas.yview_scroll(1, "units"))
self.canvas.focus_set()
if __name__ == "__main__":
root = tk.Tk()
Example(root).pack(fill="both", expand=True)
root.mainloop()
Хорошее объяснение. Спасибо! –