TkInter:画错了位置

时间:2015-05-15 10:05:41

标签: python python-2.7 tkinter

我在画布上加载了一张图片。这是一张大图,所以我需要垂直和水平滚动才能看到它。我还让用户使用图像上的鼠标指针绘制随机曲线/线条。

一切都很好,只是当我水平或垂直滚动​​然后我尝试绘制时,我看到曲线不是在鼠标指向的地方绘制的,而是在其他地方绘制的。我该如何解决这个问题?

这是我的代码:

import PIL.Image
import PIL.ImageTk
from Tkinter import *    
import numpy as np
import cv2   

class ExampleApp(Frame):
   def __init__(self,master):
        Frame.__init__(self,master=None)
        self.x = self.y = 0
        self.imcv=None
        self.canvas=Canvas(self,width=600,height=600)
        self.b1="up"
        self.liste=[]
        self.xold=None
        self.yold=None

   def dessiner(self):
       # Load the imge and allow user to scroll it if it is large.
       self.canvas.bind("<Motion>",self.motion)
       self.canvas.bind("<ButtonPress-1>",self.b1down)
       self.canvas.bind("<ButtonRelease-1>",self.b1up)
       self.sbarv=Scrollbar(self,orient=VERTICAL)
       self.sbarh=Scrollbar(self,orient=HORIZONTAL)
       self.sbarv.config(command=self.canvas.yview)
       self.sbarh.config(command=self.canvas.xview)

       self.canvas.config(yscrollcommand=self.sbarv.set)
       self.canvas.config(xscrollcommand=self.sbarh.set)

       self.canvas.grid(row=0,column=0,sticky=N+S+E+W)
       self.sbarv.grid(row=0,column=1,stick=N+S)
       self.sbarh.grid(row=1,column=0,sticky=E+W)
       self.im = PIL.Image.open("image.jpg")
       self.widt,self.heigt=self.im.size
       self.canvas.config(scrollregion=(0,0,self.widt,self.heigt))
       self.tk_im = PIL.ImageTk.PhotoImage(self.im)
       self.canvas.create_image(0,0,anchor="nw",image=self.tk_im)   


   def b1up(self,event):
       self.b1="up"
   def b1down(self,event):
       self.b1="down"
       self.xold=None
       self.yold=None
       self.liste.append((self.xold,self.yold))
   def motion(self,event):
       if self.b1=="down":
           if self.xold is not None and self.yold is not None:
               event.widget.create_line(self.xold,self.yold,event.x,event.y,fill="red",width=3,smooth=TRUE)
           self.xold=event.x
           self.yold=event.y
           self.liste.append((self.xold,self.yold))


if __name__ == "__main__":
    root=Tk()
    app = ExampleApp(root)
    app.pack()
    app.dessiner()
    root.mainloop()

如果您想查看我的问题,那么您可以下载this大图片并将其命名为 image.jpg 并运行代码。

可能是使用canvasxcanvasy的解决方案,但我不知道如何。

提前谢谢

2 个答案:

答案 0 :(得分:1)

事件对象中的坐标位于窗口坐标系中。您需要将它们转换为画布坐标系。 Tkinter有两种方法:canvasxcanvasy

答案 1 :(得分:0)

我通过更改这些行来解决问题:

event.widget.create_line(self.xold,self.yold,event.x,event.y,fill="red",width=3,smooth=TRUE)

self.xold=event.x
self.yold=event.y

为:

event.widget.create_line(self.xold,self.yold,self.canvas.canvasx(event.x),self.canvas.canvasy(event.y),fill="red",width=3,smooth=TRUE)

self.xold=self.canvas.canvasx(event.x)
self.yold=self.canvas.canvasy(event.y)