2015-11-12 3 views
1

Я пишу приложение python, которое использует Tkinter, и его холст используется для рисования диаграмм из палитры. Диаграммы могут стать довольно большими, и в настоящее время я использую кнопку мыши (ButtonPress-1), чтобы удерживать нажатой и перетаскивать весь холст.Tkinter: Как прокрутить весь холст с помощью клавиш со стрелками?

У меня возникли трудности с пониманием того, как реализовать прокрутку всего холста с помощью клавиш со стрелками (клавиатура вверх, вниз, влево и вправо).

Помощь!

ответ

3

Методы холста используются для прокрутки холста способами 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() 
+0

Хорошее объяснение. Спасибо! –

Смежные вопросы