2013-07-21 2 views
0

캔버스에 이미지를 그리기로되어있는 while 문 안에 문이 있지만 상황이 발생하지 않습니다. 이유는 모르겠지만 오류가 나타나지 않습니다. .파이썬 - 이미지가 캔버스에 그려지지 않습니다.

def buttonclick_gamescreen(event): 
    global scorecounter 
    global pressed 
    global randomimage 
    global images 
    pressed = "" 

    if event.x >853 and event.x <957 and event.y > 8 and event.y < 56 : pressed = 7 
    if event.x >666 and event.x <947 and event.y > 491 and event.y < 534 : pressed = 8 
    while pressed == 8 : 
     entryx = e1.get() 
     entryy = e2.get() 
     answerx = answerlistx[randomimage] 
     answery = answerlisty[randomimage] 
     print("The answer to X is", answerx, "You entered", entryx,"The answer to Y is", answery, "You entered ", entryy) 
     if entryx == answerx and entryy == answery: 
      print("correct") 
      canvas.delete(images) 
      randomimage = random.randrange(0,49+1) 
      scorecounter = scorecounter + 1 
      print("You score is now", scorecounter, "New random number is", randomimage) 
      game = PhotoImage(file=imagelist[randomimage]) 
      images = canvas.create_image(30, 65, image = game, anchor = NW) 
      e1.delete(0, END) 
      e2.delete(0, END) 
      pressed = '' 
     else: 
      print("incorrect") 
      e1.delete(0, END) 
      e2.delete(0, END) 
      pressed = '' 

라인 images = canvas.create_image(30, 65, image = game, anchor = NW)은 나를 위해 다른 경우에 효과가 있습니다.

다음은 캔버스가 그려지는 곳을 보여주는이 질문을 너무 길고 지저분하게하고 싶지 않으므로 나머지 코드에 대한 링크입니다. http://pastebin.com/RxmPDUAD 지금 당장은 클래스를 만들고 거기에서 함수를 호출해야합니다. EDIT : 운이없는 전역 변수와 클래스를 사용해 보았지만 여전히 문제가 있습니다.

난이도가 문제가되지 않습니다. 단지 이미지가 인쇄되기 직전에 인쇄 된 것처럼 작동하지 않지만 작동하지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+0

당신이 주회 돌이를 입력되는 것을 방지하기 위해 PhotoImageFrame 바인딩 할 self 키워드를 사용할 수 있습니까? 당신이 할 때까지 아무런 일도 일어나지 않을 것입니다. 모든 작업은 본질적으로 대기 상태에 있으며, 메인 루프는 작업 대기열을 통해 실행되며 모든 작업, 프로세스 이벤트 등을 수행합니다. – GP89

+0

그게 무슨 뜻인지는 모르겠지만 그렇지 않다고 추측합니다. 그 말을 올려 주셔서 감사합니다. – ThatsNotMyName

+0

어쨌든'canvas.mainloop()'를 호출하고 있습니까? (당신이 제공 한 코드에는 없지만 정의되지 않은 기호가 있기 때문에 모든 코드가 아닌 것 같습니다.) – GP89

답변

3

실제로 코드를 테스트하지 않고이 메서드를 끝내면 PhotoImage 개체가 가비지 수집되고 있다는 것이 확실합니다. 어떤 기묘한 이유 때문에, 그냥 canvas.create_image에 전달하면이 문제를 막지 못할 것입니다. 그들에게 global을보십시오 :

global game 
game = PhotoImage(file=imagelist[randomimage]) 
images = canvas.create_image(30, 65, image = game, anchor = NW) 

는 또한 this, thisthis 관련 질문/답변을 참조하십시오.

좀 더 포인터 : event.x >853 and event.x <957 같은

  • 조건을 정의 할 수 853 < event.x < 957
  • 로 기록 될 수 있습니다 after 방법은 밀리 초 단위로 시간이 걸립니다, 그래서이 있어야한다 생각 imagelist
  • ["%d.gif" % (i+1) for i in range(50)]after(1000, ...)
  • while pressed == 8: 루프는부터 많은 의미가 없습니다.은 한 번의 반복 작업 후에 ''으로 설정되어 있습니다.
  • 마지막으로, 사용자 정의 class GameFrame(Frame)을 정의하고 모든 것을 만드는 대신 해당 클래스에 모든 것을 넣는 것이 좋습니다 global; 이 경우, 당신은 가비지 수집
+0

답변 해 주셔서 감사합니다. – ThatsNotMyName

+0

나는 현재 클래스를 만드는 법을 배우려고하고 있는데, 이벤트 일들이 버튼이라면 (내가 아는 가장 효율적인 방법이 아니다.) – ThatsNotMyName

+0

늦게까지 답변을 드려 죄송합니다.하지만 클래스를 사용해 보았습니다. 어떤 성공도없이 전역으로 만들고, 나는 쓰레기 수집을 찾아 gc.disable()을 사용하여 많은 행운도없이 끄도록 시도했다. – ThatsNotMyName

관련 문제