Python tkinter中 圖形 無法顯示
阿新 • • 發佈:2018-12-29
問題:
- 利用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中圖形物件被垃圾回收了,圖形就會完全丟失,必須儲存顯式的圖形物件引用
- 影象物件
pic
為Demo
類中的區域性物件,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()