首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何更新Tkinter Label小部件的图像?

如何更新Tkinter Label小部件的图像?
EN

Stack Overflow用户
提问于 2010-08-14 12:59:32
回答 3查看 91.7K关注 0票数 57

我希望能够交换Tkinter标签上的图像,但我不确定如何做到这一点,除了替换小部件本身。

目前,我可以像这样显示图像:

代码语言:javascript
复制
import Tkinter as tk
import ImageTk

root = tk.Tk()
img = ImageTk.PhotoImage(Image.open(path))
panel = tk.Label(root, image = img)
panel.pack(side = "bottom", fill = "both", expand = "yes")
root.mainloop()

但是,当用户按下ENTER键时,我想要更改图像。

代码语言:javascript
复制
import Tkinter as tk
import ImageTk

root = tk.Tk()

img = ImageTk.PhotoImage(Image.open(path))
panel = tk.Label(root, image = img)
panel.pack(side = "bottom", fill = "both", expand = "yes")

def callback(e):
    # change image

root.bind("<Return>", callback)
root.mainloop()

这个是可能的吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-08-14 13:28:59

panel.configure(image=img)中,label.configure方法可以正常工作。

我忘记做的是包括panel.image=img,以防止垃圾收集删除图像。

以下是新版本:

代码语言:javascript
复制
import Tkinter as tk
import ImageTk


root = tk.Tk()

img = ImageTk.PhotoImage(Image.open(path))
panel = tk.Label(root, image=img)
panel.pack(side="bottom", fill="both", expand="yes")

def callback(e):
    img2 = ImageTk.PhotoImage(Image.open(path2))
    panel.configure(image=img2)
    panel.image = img2

root.bind("<Return>", callback)
root.mainloop()

原始代码之所以有效,是因为图像存储在全局变量img中。

票数 96
EN

Stack Overflow用户

发布于 2018-02-12 06:56:15

这是另一种选择。

使用面向对象的编程和交互式界面来更新图像。

代码语言:javascript
复制
from Tkinter import *
import tkFileDialog
from tkFileDialog import askdirectory
from PIL import  Image

class GUI(Frame):

    def __init__(self, master=None):
        Frame.__init__(self, master)
        w,h = 650, 650
        master.minsize(width=w, height=h)
        master.maxsize(width=w, height=h)
        self.pack()

        self.file = Button(self, text='Browse', command=self.choose)
        self.choose = Label(self, text="Choose file").pack()
        self.image = PhotoImage(file='cualitativa.gif')
        self.label = Label(image=self.image)


        self.file.pack()
        self.label.pack()

    def choose(self):
        ifile = tkFileDialog.askopenfile(parent=self,mode='rb',title='Choose a file')
        path = ifile.name
        self.image2 = PhotoImage(file=path)
        self.label.configure(image=self.image2)
        self.label.image=self.image2


root = Tk()
app = GUI(master=root)
app.mainloop()
root.destroy()

将“cualitativa.jpg”替换为要使用的默认图像。

票数 4
EN

Stack Overflow用户

发布于 2021-04-27 22:55:58

另一个可能会有所帮助的解决方案。

在我的例子中,我有两个tk.Tk()窗口。使用ImageTk.PhotoImage()时,对象默认将其tk窗口设置为第一个创建的窗口。解决这个问题的一个简单方法是传递您想要的tk窗口作为ImageTk.PhotoImage(img, master=your_window)

代码语言:javascript
复制
import tkinter as tk 
from PIL import ImageTk, Image
if __name__ == '__main__':
     main_window = tk.Tk()
     second_window = tk.Tk()
     
     main_canvas = Canvas(second_window)
     main_canvas.pack()
     
     filename = 'test.png'

     img = Image.open(filename)
     img = img.resize((300, 100), Image.ANTIALIAS)
     logo = ImageTk.PhotoImage(img, master=second_window)
     logo_label = Label(master=main_canvas, image=logo)
     logo_label.image = logo
     logo_label.pack()

     main_window.mainloop()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3482081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档