2010-02-08 167 views
3

我正在嘗試學習一些Python和Tkinter。下面的示例代碼旨在在屏幕上放置兩個窗口,幾個按鈕和一個帶有圖像的畫布,並在其上繪製一些線條。Tkinter畫布不顯示

窗口和按鈕顯示得很好,但我沒有看到畫布圖像或畫布線。我很感謝一些幫助,弄清楚什麼是需要讓我的畫布顯示。

from Tkinter import * 
import Image, ImageTk 

class App: 

    def __init__(self, master): 

    def scrollWheelClicked(event): 
     print "Wheel wheeled" 

    frame = Frame(master) 
    frame.pack() 
    self.button = Button(frame, text = "QUIT", fg="red", command=frame.quit) 
    self.button.pack(side=LEFT) 

    self.hi_there = Button(frame, text="Hello", command=self.say_hi) 
    self.hi_there.pack(side=LEFT) 

    top = Toplevel() 
    canvas = Canvas(master=top, width=600, height=600) 

    image = Image.open("c:\lena.jpg") 
    photo = ImageTk.PhotoImage(image) 
    item = canvas.create_image(0, 0, image=photo) 

    canvas.create_line(0, 0, 200, 100) 
    canvas.create_line(0, 100, 200, 0, fill="red", dash=(4, 4)) 
    canvas.create_rectangle(50, 25, 150, 75, fill="blue") 

    canvas.pack 

    testBtn = Button(top, text = "test button") 
    testBtn.pack() 

def say_hi(self): 
    print "hi there everyone!" 

root = Tk() 
app = App(root) 
root.mainloop() 
+0

對於圖像,在將包改爲pack()後,將圖像線修改爲: self.image = Image.open(「c:\ lena.jpg」) self.photo = ImageTk.PhotoImage(self.image) canvas.create_image(0,0,image = self.photo) 我認爲這與垃圾回收有關 – SooDesuNe 2010-02-08 19:01:39

回答

2

在畫布對象上調用包時需要括號。否則,你只是指向函數對象,而不是調用它。

例如:

canvas.pack() 

又如:

>>>def hello(): 
... print "hello world" 
... return 

>>>hello返回功能參考(在0X功能你好....)

>>>hello()實際調用Hello功能

+0

啊哈!這兩條線和矩形都會顯示,但是圖像仍然不可見。 – SooDesuNe 2010-02-08 18:56:30

+1

你可能會在圖像上繪製矩形(疊加),因爲它有填充?根據文檔(http://effbot.org/tkinterbook/canvas.htm),「新的項目是在舊的頂部繪製」 – Brian 2010-02-08 19:18:05

5

我解決了這個問題:

self.photo = ImageTk.PhotoImage(image) 
self.item = canvas.create_image(0, 0, image=self.photo) 

到ImageTk實例的引用必須存儲在某個地方,或者當你App.__init__()方法返回,這將是垃圾收集,並在畫布將無法顯示。 (Tkinter不保留對圖像的引用。)

保留引用的一種方法是將其存儲在「self.photo」或名爲「photo」的變量中,或者像大多數程序員一樣常量變量(不變的變量,如'TEN = 10'),'PHOTO = PhotoImage(...)'爲什麼...我不知道。導入模塊'gc'(內置Python 3的垃圾收集模塊)並運行gc.disable()不起作用。 (如果你想嘗試一下:https://docs.python.org/3/library/gc.html

+1

好的!只是個問題,爲什麼? – 2011-08-24 16:43:09

+0

謝謝你的回答。 – Yauhen 2012-06-23 09:33:32

+0

謝謝,這節省了我很多時間 – poco 2014-04-18 10:08:38