如何替换现有图像而不是添加其他图像?

时间:2018-02-12 19:35:09

标签: python tkinter

这是我第一次来这里,我真的很感激这方面的帮助。

所以我有一些代码运行Tkinter选项卡并显示2个按钮。如果单击第一个,则会显示猫的图片。

但是,如果再次单击该按钮,则会在底部再次显示相同的图片,并显示2。

如果单击另一个标题为N / A的按钮,则会出现另一张图片。但是,如果再次单击该按钮,则图片会重复。

我想这样做,以便按下每个按钮时,图像被替换,而不是重复。

这是我到目前为止所拥有的。

from tkinter import *

root = Tk()

class HomeClass(object):
    def __init__(self, master):
        frame = Frame(master)
        frame.pack()

        self.WelcomeLabel = Label(root, text="Welcome to the game!",
                                  bg="Black", fg="White")
        self.WelcomeLabel.pack(fill=X)

        self.FirstButton = Button(root, text="Start", bg="RED", fg="White",
                                 command=self.FirstClick)
        self.FirstButton.pack(side=LEFT, fill=X)

        self.SecondButton = Button(root, text="N/A", bg="Blue", fg="White",
                                   command=self.SecondClick)
        self.SecondButton.pack(side=LEFT, fill=X)

    def FirstClick(self):
        FirstPhoto = PhotoImage(file="keyboardcat.gif")
        FiLabel = Label(root, image=FirstPhoto)
        FiLabel.img = FirstPhoto
        FiLabel.pack()


    def SecondClick(self):
        FirstPhoto = PhotoImage(file="donald.gif")
        FiLabel = Label(root, image=FirstPhoto)
        FiLabel.img = FirstPhoto
        FiLabel.pack()


k = HomeClass(root)
root.mainloop()

4 个答案:

答案 0 :(得分:1)

因为每次单击按钮时,您都会调用FirstClick方法,而后者又会创建PhotoImage类的新实例。我认为最好存储FirstPhoto并在每个FirstClick方法中调用检查它是否已经有值。

class HomeClass(object):
    def __init__(self, master):
        frame = Frame(master)
        frame.pack()

        self.WelcomeLabel = Label(root, text="Welcome to the game!",
                              bg="Black", fg="White")
        self.WelcomeLabel.pack(fill=X)

        self.FirstButton = Button(root, text="Start", bg="RED", fg="White",
                             command=self.FirstClick)
        self.FirstButton.pack(side=LEFT, fill=X)

        self.SecondButton = Button(root, text="N/A", bg="Blue", fg="White",
                               command=self.SecondClick)
        self.SecondButton.pack(side=LEFT, fill=X)

        self.FirstPhoto = None

    def FirstClick(self):
        if self.FirstPhoto is None:
            self.FirstPhoto = PhotoImage(file="ksiazka.png")
            self.FiLabel = Label(root, image=self.FirstPhoto)
            self.FiLabel.img = self.FirstPhoto
            self.FiLabel.pack()

答案 1 :(得分:0)

在此示例中,您有两个方法FirstClick,SecondClick显示图像和两个方法来相应地清除第一个和第二个图像:clearFirstImage,clearSecondImage。您只需添加两个按钮即可触发这些清晰的方法:)

from tkinter import *
from tkFileDialog import askopenfilename

root = Tk()

class HomeClass(object):
    def __init__(self, master):
        self.master = master
        self.frame = Frame(master)


        self.WelcomeLabel = Label(root, text="Welcome to the game!",
                                bg="Black", fg="White")
        self.WelcomeLabel.pack(fill=X)

        self.FirstButton = Button(root, text="Start", bg="RED", fg="White",
                                command=self.FirstClick)
        self.FirstButton.pack(side=LEFT, fill=X)

        self.SecondButton = Button(root, text="N/A", bg="Blue", fg="White",
                                command=self.SecondClick)
        self.SecondButton.pack(side=LEFT, fill=X)

        self.ToggleButtonText = "Show image"
        self.ToggleButton = Button(root, text=self.ToggleButtonText, bg="Grey", fg="White",
                                command=self.ToggleClick)
        self.ToggleButton.pack(side=LEFT, fill=X)

        self.FirstPhoto = None
        self.FiLabel = None

        self.SecondPhoto = None
        self.SecondPhotoLabel = None

        self.ToggleButtonPhoto = None
        self.ToggleButtonPhotoLabel = None
        self.frame.pack()

    def FirstClick(self):
        if self.FirstPhoto is None:
            self.FirstPhoto = PhotoImage(file="ksiazka.png")
            self.FiLabel = Label(root, image=self.FirstPhoto)
            self.FiLabel.img = self.FirstPhoto
            self.FiLabel.pack()

    def ToggleClick(self):
        if self.ToggleButtonPhoto is None:
            self.ToggleButtonPhoto = PhotoImage(file="ksiazka.png")
            self.ToggleButtonPhotoLabel = Label(self.frame, image=self.ToggleButtonPhoto)
            self.ToggleButtonPhotoLabel.img = self.ToggleButtonPhoto
            self.ToggleButtonPhotoLabel.pack()

            # and set label
            self.ToggleButton.config(text="Hide image")
        else:
            self.ToggleButton.config(text="Show image")
            self.ToggleButtonPhotoLabel.destroy()
            self.ToggleButtonPhotoLabel.img = None
            self.ToggleButtonPhotoLabel = None
            self.ToggleButtonPhoto = None
            self.frame.pack()


    def SecondClick(self):
        filename = askopenfilename()
        allowed_extensions = ['jpg', 'png']
        if len(filename) > 0 and filename.split('.')[-1] in allowed_extensions:
            self.SecondPhoto = PhotoImage(file=filename)
            self.SecondPhotoLabel = Label(root, image=self.SecondPhoto)
            self.SecondPhotoLabel.img = self.SecondPhoto
            self.SecondPhotoLabel.pack()

    def clearFirstImage(self):
        self.FirstPhoto = None
        self.FiLabel = None

    def clearSecondImage(self):
        self.SecondPhoto = None
        self.SecondPhotoLabel = None


k = HomeClass(root)
root.mainloop()

答案 2 :(得分:0)

尝试此更改SecondPhoto

/opt/rh/python27/root/usr/lib64 to file /etc/ld.so.conf

注意 - 您可以在使用PhotoImage读取之前声明newImage,然后将图像名称放在.config

答案 3 :(得分:0)

如果要替换现有图像,请首先创建显示图像的label,然后只需每次单击即可重新配置其图像选项。下面是一个例子:

try:                        # In order to be able to import tkinter for
    import tkinter as tk    # either in python 2 or in python 3
except ImportError:
    import Tkinter as tk


def download_images():
    # In order to fetch the image online
    try:
        import urllib.request as url
    except ImportError:
        import urllib as url
    url.urlretrieve("https://i.stack.imgur.com/57uJJ.gif", "13.gif")
    url.urlretrieve("https://i.stack.imgur.com/8LThi.gif", "8.gif")


class ImageFrame(tk.Frame):
    def __init__(self, master, *args, **kwargs):
        tk.Frame.__init__(self, master, *args, **kwargs)
        self._create_widgets()
        self._display_widgets()


    def _create_widgets(self):
        def __create_image_label():
            def ___load_images():
                self.label.images = list()
                self.label.images.append(tk.PhotoImage(file="8.gif"))
                self.label.images.append(tk.PhotoImage(file="13.gif"))


            self.label = tk.Label(self)
            ___load_images()


        def __create_buttons():
            self.buttons = list()
            for i in range(2):
                self.buttons.append(tk.Button(self, text=i,
                                command=lambda i=i: self.replace_image(i)))

        __create_image_label()
        __create_buttons()


    def replace_image(self, button_index):
        """
        Replaces the image in label attribute based on the index of the
        button pressed.
        """
        self.label['image'] = self.label.images[button_index]


    def _display_widgets(self):
        self.label.pack()
        for i in range(2):
            self.buttons[i].pack(fill='x', expand=True)


if __name__ == '__main__':
    #download_images() # comment out after initial run
    root = tk.Tk()
    frame = ImageFrame(root)
    frame.pack()
    tk.mainloop()