파이썬 tkinter 공부 중인데 질문있습니다.

조회수 79회

윈도우 창에서 도형을 생성하고 방향키로 이동하는데 윈도우 창 크기를 넘어가 도형이 사라지는걸 방지하기 위한 코드를 작성하고 있습니다.

def move_left(event):
    global x
    x -= 10
    if x < 0:
        move_cant(event)
        x += 10
    else:
        canvas.move(id, -10, 0)
canvas.bind_all('<KeyPress-Left>', move_left)

이렇게 작성하여 도형이 0 값 아래로 내려가면 이동이 불가 하게끔 계획하였습니다. 그러기 위해서 x y에 값을 넣고 id=canvas.create_oval(0, 0, x, y, fill="green") 작성에서 숫자가 아닌 x y로 대체 후 매 이동시 x값과 y값에 +-를 하여 0값보다 작을때 또는 윈도우 최대값보다 클 때 이동금지를 하고 싶습니다.

하지만 막상 실행시키면 윈도우 창 크기 다를때 도형 크기 다를때 오류가 나고 있네요. 원래 window_width, window_height 값을 넣고 canvas = Canvas(window, window_width, window_height) 이렇게 하고 싶었으나 잘못된 방법이라 하여 무의미하지만 window_width 따로 적고 Canvas에 width 값 따로 넣었습니다..

결론을 말씀드리면 id(도형)의 위치값 받아서 윈도우 창을 벗어나지 않게 하고 싶습니다. 도와주시면 감사하겠습니다.


from tkinter import *
window = Tk()

window_width = 700
window_height = 700

canvas = Canvas(window, width= 700, height=700)
canvas.pack()


x = 400
y = 400


id=canvas.create_oval(0, 0, x, y, fill="green")


def  move_cant(event):
    label = Label(window, text = "이동불가!")
    label.pack()

def move_left(event):
    global x
    x -= 10
    if x < 0:
        move_cant(event)
        x += 10
    else:
        canvas.move(id, -10, 0)
canvas.bind_all('<KeyPress-Left>', move_left)

def move_right(event):
    global x
    x += 10
    if x > window_width:
        move_cant(event)
        x -= 10
    else:
        canvas.move(id, 10, 0)
canvas.bind_all('<KeyPress-Right>', move_right)

def move_up(event):
    global y
    y -= 10
    if y < 0:
        move_cant(event)
        y += 10
    else:
        canvas.move(id, 0, -10)
canvas.bind_all('<KeyPress-Up>', move_up)

def move_down(event):
    global y
    y += 10
    if y > window_height:
        move_cant(event)
        y -= 10
    else:
        canvas.move(id, 0, 10)
canvas.bind_all('<KeyPress-Down>', move_down)
mainloop()

  • 오류라는게 어떤 것인지요? 제약 조건을 잘못 걸어서 원이 밖으로 나가긴 하지만 일단 코드는 잘 돌아가는 것 같습니다만... digda 2020.5.22 21:15
  • canvas = Canvas(window, window_width, window_height)에 window_width, window_heigh 를 width= 700, height=700 대신 넣으면 빨간색 밑줄을 뜬다는 의미였습니다. 그리고 말씀하신대로 원이 밖으로 나가면 안되는데 나가는 이유를 모르겠네요. 전 나름 생각해서 적은건데 ㅠㅠ HNG 2020.5.22 21:58

답변을 하려면 로그인이 필요합니다.

Hashcode는 개발자들을 위한 무료 QnA 사이트입니다. 계정을 생성하셔야만 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 계정을 생성하셔야만 글을 작성하실 수 있습니다.