2017-10-27 2 views
2

캔버스 내에서 이미지를 가져 와서 클릭 할 때마다 페인트 기능을 클릭하여 점을 그립니다.클릭 이벤트에서 캔버스에 점을 그리는 방법 Tkinter Python

을 제외한 모든 항목이 정상적으로 작동하고 있습니다. 페인트 기능이 제대로 작동하지 않습니다.

바람직한 출력

클릭 이벤트는 점을 그립니다. 클릭 이벤트

실제 출력

에 드래그 할 필요가 나는 캔버스에 그림을보기 위해 마우스 클릭 이벤트에 드래그 할 필요가 없습니다.

페인트 기능에 약간의 문제가있을 수 있습니다. 그러나 나는 그것이 정확히 무엇인지 알 수 없었다.

from tkinter import * 
from PIL import Image, ImageTk 


class Main(object): 

    def __init__(self): 
     self.canvas = None 

    def main(self): 
     master = Tk() 

     # Right side of the screen/image holder 
     right_frame = Frame(master, width=500, height=500, cursor="dot") 
     right_frame.pack(side=LEFT) 

     # Retrieve image 
     image = Image.open("./image/demo.JPG") 
     image = image.resize((800, 700), Image.ANTIALIAS) 
     photo = ImageTk.PhotoImage(image) 

     # Create canvas 
     self.canvas = Canvas(right_frame, width=800, height=700) 
     self.canvas.create_image(0, 0, image=photo, anchor="nw") 
     self.canvas.pack() 
     self.canvas.bind("<B1-Motion>", self.paint) 

     mainloop() 

    def paint(self, event): 
     python_green = "#476042" 
     x1, y1 = (event.x - 1), (event.y - 1) 
     x2, y2 = (event.x + 1), (event.y + 1) 
     self.canvas.create_oval(x1, y1, x2, y2, fill=python_green, outline=python_green, width=10) 


if __name__ == "__main__": 
    Main().main() 

수정 :

추가 된이 두 가지 방법이에

def on_button_press(self, event): 
    self.x = event.x 
    self.y = event.y 

def on_button_release(self, event): 
    python_green = "#476042" 
    x0,y0 = (self.x, self.y) 
    x1,y1 = (event.x, event.y) 

변경된 캔버스 :

self.canvas.bind("<ButtonPress-1>", self.on_button_press) 
self.canvas.bind("<ButtonRelease-1>", self.on_button_release) 

답변

3

만 클릭하고 마우스를 이동하지 않습니다, B1-Motion 트리거하지 않습니다.

마우스 누르기와 마우스 이동에 바인딩하려면 mainloop 앞에 self.canvas.bind("<ButtonPress-1>", self.paint)을 추가하면됩니다.

관련 문제