2013-05-30 4 views
3

tkinter 캔버스 옵션을 사용하여 이미지를 파이썬으로 표시하려고합니다. 그러나 아래에있는 클래스에서 입력하면 오류가 발생하지 않지만 내 이미지는 표시되지 않습니다. 버튼은 올바르게 표시됩니다. 또한 클래스에서이 이미지를 생성하기위한 코드를 취하면 제대로 작동합니다. 나는 그 문제가 무엇인지 알아낼 수 없다.tkinter 캔버스 이미지가 클래스에 표시되지 않습니다.

import Tkinter as tk 
from Tkinter import * 

class Board(tk.Frame): 
    def __init__(self,parent): 

     frame = Frame(parent) 
     frame.pack() 
     tk.Frame.__init__(self,parent) 

     frame2 = Frame(frame) 
     frame2.pack() 

     c=Canvas(frame2) 
     c.pack(expand=YES,fill=BOTH) 
     background=PhotoImage(file='Board.gif') 
     c.create_image(100,100,image=background,anchor='nw') 

     button = Button(frame, text="Next turn", command=self.next_turn) 
     button.pack() 

     button = Button(frame, text="Roll the dice", command=self.roll) 
     button.pack() 

     .... 

root = Tk() 
board = Board(root) 
board.pack() 
root.mainloop() 
+0

가 왜 tk'과''Tkinter를 가져 오기 *에서와 같은 모두'수입은 Tkinter을하고있다 : 이것은 단지 예 (당신이 대신 c.backgroundself.background을 사용할 수 있습니다)인가? –

+0

선생님이 모든 것을 가져 왔는지 확인하기 위해 선생님에게 그렇게하라고했습니다. 나는 그것이 nessecary가 아니라는 것을 안다. 그러나 지금 tk를 가지고있는 몇 개의 선이있다. 무엇인가. 그리고 만일 내가 단지 tk를 삭제하면. 내 프로그램 괴물. 그게 문제가 될 수 있다고 생각하니? – konovalov100

+0

그 이유는 아마도'tk.Frame .__ init __ (self, parent)'와'class Board (tk.Frame) '때문일 것입니다. '__init__' 메쏘드를 직접 호출하는 이유는 모르겠지만 그것을'Frame .__ init __ (self, parent)'와'class Board (Frame)'로 변경할 수 있습니다. 나는 당신이 그것에 대한 참조를 유지하고 있지 않기 때문에 Frame이 어떤 목적을 위해 사용되는지를 보지 못합니다. –

답변

5

PhotoImage에 대한 참조를 유지해야합니다.

c = Canvas(frame2) 
    c.pack(expand=YES,fill=BOTH) 
    c.background = PhotoImage(file='Board.gif') 
    c.create_image(100,100,image=c.background,anchor='nw') 
+0

고마워요! 이 문제가 해결되어 정말로 찾지 못했습니다. – konovalov100

+0

@ user2438352 도움이되기를 기쁘게 생각합니다.) 문제가 해결되면 답변을 수락하십시오. –

+0

'Canvas.create_image()'가 전달 된'image = '의 참조 카운트를 증가시켜 함수가 반환 될 때 파괴되지 않는 이유는 무엇입니까? 일반적인 파이썬의 메모리 관리 규칙에 따라야하는 것처럼 보입니다. – martineau

관련 문제