2013-05-30 165 views
3

我想在Python中使用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

你爲什麼這樣做既'進口的Tkinter作爲tk'和'從Tkinter的進口*'? –

+0

我的老師告訴我要這麼做,以確保所有東西都被導入了。我知道這不是祕密,但現在有一些行有tk.'something',如果我只是刪除tk。我的程序嚇壞了。你認爲這可能是問題? – konovalov100

+0

這可能是由於'tk.Frame .__ init __(self,parent)'和'class Board(tk.Frame)'。你可以把它改成'Frame .__ init __(self,parent)'和'class board(Frame)',它應該可以工作,但我不知道你爲什麼直接調用'__init__'方法。我沒有看到Frame服務的目的是什麼,因爲你沒有參考它。 –

回答

5

您必須保留對PhotoImage的引用。這只是和例子(你也可以使用self.background代替c.background):

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 ='的引用計數,因此它在函數返回時不會被銷燬?似乎應該按照通常的Python內存管理規則進行。 – martineau