2011-03-24 96 views
0

基本上我有以下代碼工作,但我找不到一種方法來減緩我的畫布視圖拖動,截至目前它的速度太快,無法用於我的應用程序。這只是一個小例子,顯示我想要解決:放慢Tkinter帆布在Python中滾動

from Tkinter import * 
import Image, ImageTk 

class GUI: 
    def __init__(self,root): 
     frame = Frame(root, bd=2, relief=SUNKEN) 

     frame.grid_rowconfigure(0, weight=1) 
     frame.grid_columnconfigure(0, weight=1) 
     xscrollbar = Scrollbar(frame, orient=HORIZONTAL) 
     xscrollbar.grid(row=1, column=0, sticky=E+W) 
     yscrollbar = Scrollbar(frame) 
     yscrollbar.grid(row=0, column=1, sticky=N+S) 
     self.canvas = Canvas(frame, bd=0, xscrollcommand=xscrollbar.set, yscrollcommand=yscrollbar.set) 
     self.canvas.grid(row=0, column=0, sticky=N+S+E+W) 

     File = "JPG FILENAME HERE" 

     self.img = ImageTk.PhotoImage(Image.open(File)) 
     self.canvas.create_image(0,0,image=self.img, anchor="nw") 
     self.canvas.config(scrollregion=self.canvas.bbox(ALL)) 
     xscrollbar.config(command=self.canvas.xview) 
     yscrollbar.config(command=self.canvas.yview) 

     frame.pack() 

     self.canvas.bind("<Button 3>",self.grab) 
     self.canvas.bind("<B3-Motion>",self.drag) 

    def grab(self,event): 
     self._y = event.y 
     self._x = event.x 

    def drag(self,event): 
     if (self._y-event.y < 0): self.canvas.yview("scroll",-1,"units") 
     elif (self._y-event.y > 0): self.canvas.yview("scroll",1,"units") 
     if (self._x-event.x < 0): self.canvas.xview("scroll",-1,"units") 
     elif (self._x-event.x > 0): self.canvas.xview("scroll",1,"units") 
     self._x = event.x 
     self._y = event.y 

root = Tk() 
GUI(root) 
root.mainloop() 

答:

布萊恩·奧克利的回答做我只是改變了招:

self.canvas = Canvas(frame, bd=0, xscrollcommand=xscrollbar.set, yscrollcommand=yscrollbar.set) 

到:

self.canvas = Canvas(frame, bd=0, xscrollcommand=xscrollbar.set, yscrollcommand=yscrollbar.set,xscrollincrement=10,yscrollincrement=10) 

它的工作就像一個魅力。

回答

2

嘗試將畫布的xscrollincrementyscrollincrement屬性的值設置爲大於零的值。這些設置對應使用,當你打電話xviewyview與「單位」的說法(如unitsself.canvas.xview("scroll",-1,"units")

根據官方Tk的文檔,如果這些值是零(默認值),的xView和yview調整「...以[x,y] ScrollIncrement選項爲單位,如果它大於零,或者以窗口[寬度,高度]的十分之一爲單位,否則」

+0

這很好,謝謝! – Symon 2011-03-25 16:10:02

2

我真的不知道我在這裏做什麼,但至少在這個過程中可控制性更強。首先,明確設置畫布大小:

self.canvas = Canvas(frame, bd=0, height=600, width=800, 
        xscrollcommand=self.xscrollbar.set, 
        yscrollcommand=self.yscrollbar.set) 

然後,在__init__(),添加幾個實例變量來保持當前位置的軌跡:

self.pos_x = self.pos_y = 0.0 

接着,以該更換drag方法:

def drag(self, event): 
# Note canvas dimensions are used here 
    self.pos_x += float(self._x-event.x)/800.0 
    self.pos_y += float(self._y-event.y)/600.0 

    if self.pos_x < 0.0: self.pos_x = 0.0 
    elif self.pos_x > 1.0: self.pos_x = 1.0 
    if self.pos_y < 0.0: self.pos_y = 0.0 
    elif self.pos_y > 1.0: self.pos_y = 1.0 

    self.canvas.xview("moveto", self.pos_x) 
    self.canvas.yview("moveto", self.pos_y) 

    self._x = event.x 
    self._y = event.y 

我不知道你爲什麼要投這些數字飄起,但如果你不這樣做這是行不通的。它很脆弱;如果你將鼠標移動乘以任何東西,即使只是0.99或1.01,運動也會變得非常虛無;我懷疑在鼠標移動和畫布移動之間會有一些反饋。它也不和滾動條一起玩,我想我們必須在移動時更新pos_x和pos_y。正如我所說,不知道我在做什麼;我沒有做太多的GUI編程。無論如何,希望這有助於。

0

試試這個,改變拖動僅使用計算值:

self.canvas.yview("scroll",self._y-event.y,"units") 
    self.canvas.xview("scroll",self._x-event.x,"units") 

並將您的滾動增量更改爲1.

現在您的圖片應該點擊&與鼠標光標同步拖動,與流行的地圖和文檔查看器類似。