2013-07-21 119 views
0

我有一個while語句裏面的聲明應該在畫布上畫一個圖像,但它不會發生,我不知道爲什麼,因爲它不顯示任何錯誤。Python - 圖像沒有畫在畫布上

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 從我現在的理解,我將不得不創建一個類,並從那裏調用函數來工作? 編輯:仍然有麻煩,因爲我試過使用全局變量和類沒有運氣。

這是不是一個隨機數的問題,因爲我打印它的圖像應該打印的行之前,只是因爲它沒有工作,但它確實如此。我究竟做錯了什麼?

+0

你進入主循環?除非你這樣做,否則任何事情都不會發生。所有任務基本上排隊,主循環將運行任務隊列並執行任何操作,處理事件等。 – GP89

+0

我不完全確定這意味着什麼,但我會猜測它不是,所以我會不得不去看看,謝謝你的評論。 – ThatsNotMyName

+0

我的意思是你在哪裏調用'canvas.mainloop()'? (您沒有提供您提供的代碼,但我認爲這不是所有的代碼,因爲那裏有未定義的符號) – GP89

回答

3

沒有真正測試過你的代碼,我敢肯定問題是當你退出該方法時,你的對象被垃圾收集。出於某種奇怪的原因,只是將它們傳遞給canvas.create_image不會阻止這一點。儘量讓他們global

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

而且看thisthisthis相關的問題/解答。

一些更多的指針:

  • 條件像event.x >853 and event.x <957可以寫爲853 < event.x < 957
  • 您可以定義imagelist["%d.gif" % (i+1) for i in range(50)]
  • after方法需要在毫秒的時間,所以我想這應該是after(1000, ...)
  • 在它的當前狀態下,while pressed == 8:循環似乎沒什麼意義,因爲pressed是一個迭代無論如何
  • 最後,我建議定義自定義class GameFrame(Frame),並把該類別所有的東西,而不是使一切global後設置爲'';在這種情況下,你可以使用關鍵字self綁定你PhotoImageFrame,以防止它被當作垃圾回收
+0

謝謝你的回答,現在就去檢查一下。 – ThatsNotMyName

+0

我目前正在努力學習如何創建一個類,如果事件是按鈕(不是我知道的最有效的方式) – ThatsNotMyName

+0

對不起,最近的回覆生病了,但我曾嘗試使用一個類,也嘗試過在沒有任何成功的情況下使它成爲全局的,我查了一下垃圾收集,並嘗試用gc.disable()關閉它,但沒有太多運氣。 – ThatsNotMyName