1. 程式人生 > >Python tkinter中 圖形 無法顯示

Python tkinter中 圖形 無法顯示

問題:

  • 利用tkinter基於Frame建立類,在其中使用了 圖形 物件。呼叫該類並執行主迴圈,視窗中無法顯示使用的影象,程式碼如下:
from tkinter import *

class Demo(Frame):
    def __init__(self, parent=None):
        Frame.__init__(self, parent)
        self.pack(expand=YES, fill=BOTH)
        
        pic = PhotoImage(file='pic.gif')
        width,
height=pic.width(), pic.height() canv = Canvas(self, width=width, height=height, relief=RIDGE, bd=2) canv.pack(side=TOP, expand=YES, fill=BOTH) canv.create_image(0, 0, image=pic, anchor=NW) if __name__ == '__main__': root = Tk() Demo(root).mainloop()

原因:

  • 和其他tkinter元件不同的是,Python中圖形物件被垃圾回收了,圖形就會完全丟失,必須儲存顯式的圖形物件引用
  • 影象物件picDemo類中的區域性物件,Demo例項化後pic物件即被垃圾回收,再呼叫其mainloop()方法時,pic物件已不存在

解決方案:

  • pic設定為類屬性self.pic
class Demo(Frame):
    def __init__(self, parent=None):
        ...
        self.pic = pic
        canv.create_image(0, 0, image=self.pic, anchor=NW)

if __name__ == '__main__':
    root =
Tk() Demo(root).mainloop()
  • 在主迴圈中建立全域性圖形物件
class Demo(Frame):
    def __init__(self, parent=None, pic=None):
        Frame.__init__(self, parent)
        self.pack(expand=YES, fill=BOTH)
        
        width, height=pic.width(), pic.height()
        canv = Canvas(self, width=width, height=height, relief=RIDGE, bd=2)
        canv.pack(side=TOP, expand=YES, fill=BOTH)
        
        canv.create_image(0, 0, image=pic, anchor=NW)

if __name__ == '__main__':
    root = Tk()
    pic = PhotoImage(file='pic.gif')
    Demo(root, pic).mainloop()