tho*_*ell 30 python image tkinter tkinter-canvas
此代码有效:
import tkinter
root = tkinter.Tk()
canvas = tkinter.Canvas(root)
canvas.grid(row = 0, column = 0)
photo = tkinter.PhotoImage(file = './test.gif')
canvas.create_image(0, 0, image=photo)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
它向我展示了图像.
现在,这段代码编译但它没有显示我的图像,我不知道为什么,因为它是相同的代码,在类中:
import tkinter
class Test:
def __init__(self, master):
canvas = tkinter.Canvas(master)
canvas.grid(row = 0, column = 0)
photo = tkinter.PhotoImage(file = './test.gif')
canvas.create_image(0, 0, image=photo)
root = tkinter.Tk()
test = Test(root)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
Bry*_*ley 44
该变量photo是一个局部变量,它在实例化类之后获取垃圾.保存对照片的引用,例如:
self.photo = tkinter.PhotoImage(...)
Run Code Online (Sandbox Code Playgroud)
如果您在"tkinter图片无法显示"上进行Google搜索,则第一个结果如下:
http://effbot.org/pyfaq/why-do-my-tkinter-images-not-appear.htm
小智 9
from tkinter import *
from PIL import ImageTk, Image
root = Tk()
def open_img():
global img
path = r"C:\.....\\"
img = ImageTk.PhotoImage(Image.open(path))
panel = Label(root, image=img)
panel.pack(side="bottom", fill="both")
but1 = Button(root, text="click to get the image", command=open_img)
but1.pack()
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
只需将 global 添加到 img 定义中即可工作
问题是 Python 通过一个称为“垃圾收集”的过程自动删除对该变量的引用。解决方案是保存参考或创建新参考。
有以下几种方法:
self增加引用计数和保存引用。import tkinter
class Test:
def __init__(self, master):
canvas = tkinter.Canvas(master)
canvas.grid(row = 0, column = 0)
self.photo = tkinter.PhotoImage(file = './test.gif') # Changes here
canvas.create_image(0, 0, image=self.photo) # Changes here
root = tkinter.Tk()
test = Test(root)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
import tkinter
l=[]
class Test:
def __init__(self, master):
canvas = tkinter.Canvas(master)
canvas.grid(row = 0, column = 0)
photo = tkinter.PhotoImage(file = './test.gif')
l.append(photo)
canvas.create_image(0, 0, image=photo)
root = tkinter.Tk()
test = Test(root)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
使用方法 2 时,您可以像我一样创建一个全局列表,也可以在类中使用列表。两者都可以。
一些有用的链接: