2017-10-26 4 views
0

이것이 아마도 가장 간단한 질문 일 것입니다. 그러나 저는 Tkinter를 배우기 시작했습니다. GUI에서 마우스 클릭이 발생했을 때 이벤트를 다시 참조하는 방법을 모르겠습니다.Tkinter를 사용하여 파이썬 캔버스에서 페인트 이벤트를 다시 참조하는 방법은 무엇입니까?

캔버스를 클릭하면 몇 가지 점을 그려보고 싶습니다. 페인트 함수에서 canvas 변수를 다시 참조 할 수 없습니다.

코드의이 작품은 내가 말한다 페인트 기능에 오류가 예제를 시도 할 때마다 SO

여기에 질문을 기반으로

NameError: name 'canvas' is not defined;

def main(): 
    master = Tk() 
    # Right side of the screen/img 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 
    canvas = Canvas(right_frame, width=800, height=700) 
    canvas.create_image(0, 0, image=photo, anchor="nw") 
    canvas.pack() 
    canvas.bind("<B1-Motion>", paint) 
    message = Label(right_frame, text="Press the mouse to draw") 
    message.pack(side=BOTTOM) 


    mainloop() 


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


if __name__ == "__main__": 
    main() 
+0

팬더 태그를 볼 수 없으므로 관련성이 높은 태그로 교체하십시오. –

+0

Ups 감사합니다. 질문을 제출했을 때 선택되지 않았 음을 나타냅니다. –

답변

2

이 단순한 실수입니다 파이썬의 범위 지정 규칙. 함수에서 작성한 변수는 해당 함수 외부에서 사용할 수 없습니다.

>>> def func(): 
... a = 42 
... 
>>> func() 
>>> a 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'a' is not defined 

캔버스를 페인트 기능에 전달해야합니다. bind을 통해이를 수행하려면 functools.partial 기능으로 수행 할 수있는 "폐쇄"가 필요합니다.

from tkinter import * 
from functools import partial 

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

    # Create canvas 
    canvas = Canvas(right_frame, width=800, height=700) 
    canvas.create_image(0, 0, image=photo, anchor="nw") 
    canvas.pack() 
    canvas.bind("<B1-Motion>", partial(paint, canvas)) 
    message = Label(right_frame, text="Press the mouse to draw") 
    message.pack(side=BOTTOM) 

    mainloop() 

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

if __name__ == "__main__": 
    main() 

다른 프로그램에서 변수를 사용할 수 있도록 이러한 종류의 프로그램에 대한 클래스 구조를 고려해야합니다.

+0

정말 고마워요. 나는 이제 클래스 구조를 만들었습니다. –