2011-03-24 65 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.

现在您的图片应该点击&与鼠标光标同步拖动,与流行的地图和文档查看器类似。