簡體   English   中英

如何更新 Tkinter 標簽小部件的圖像?

[英]How to update the image of a Tkinter Label widget?

我希望能夠換出 Tkinter 標簽上的圖像,但我不知道該怎么做,除了替換小部件本身。

目前,我可以這樣顯示圖像:

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鍵時,我想更改圖像。

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()

這可能嗎?

label.configure方法在panel.configure(image=img)中有效。

我忘了做的是包括panel.image=img ,以防止垃圾收集刪除圖像。

以下是新版本:

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中。

另一種選擇。

使用面向對象的編程並帶有交互式界面來更新圖像。

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”替換為您要使用的默認圖像。

另一個可能有幫助的解決方案。

就我而言,我有兩個tk.Tk()窗口。 使用ImageTk.PhotoImage()時,對象默認將其 tk 窗口設置為第一個創建的窗口。 一個簡單的解決方法是傳遞您想要的 tk 窗口,如ImageTk.PhotoImage(img, master=your_window)

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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM