Python:如何在标签小部件中动态显示图像(tkinter)

时间:2017-03-01 15:37:54

标签: python-3.x tkinter

我很难尝试根据前一页点击的按钮在tk页面上动态显示特定图像。 PageOne有5张图片,每张图片下方有5个按钮。单击特定按钮应该将用户带到第二页,如果单击第3个按钮,则显示图像3。

我已经想出如何根据点击的按钮传递1到5的值,并且图像保存为pic1.gif,... pic5.gif,以便返回正确的图像我只需要附加值到文件位置。

我正在努力弄清楚如何在访问时刷新PageTwo。

非常感谢任何帮助,谢谢。

TITLE_FONT = ("Helvetica", 18, "bold")
class SampleApp(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        container = tk.Frame(self)
        self.attributes("-fullscreen", False)
        self.geometry('{}x{}'.format(1000, 1000))
        container.pack(side="top", fill="both", expand=True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)


        self.frames = {}
        for F in (PageOne, PageTwo):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame(PageOne)

    def show_frame(self, c):
        frame = self.frames[c]
        frame.tkraise()

class PageOne(tk.Frame):
    praiseid = 0
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)

        def PraiseClick(button_id):

            PageOne.praiseid = button_id
            controller.show_frame(PageTwo)

        users= [1,2,3,4,5]

        for i in users:
            location = str('C:/Users/XXXXXXX/Documents/pic'+str(i)+'.gif')
            icon = tk.PhotoImage(file=location)
            IDlabel = tk.Label(self,image=icon)
            IDlabel.image = icon
            IDlabel.place(x=i*100,y=200,width=100,height=100)

        for j in users:
            praisebutton = tk.Button(self,text="Click",width=10,command=lambda x=j: PraiseClick(int(x)))
            praisebutton.place(x=j*100,y=300,width=100,height=44)

        backbutton = tk.Button(self, text="Go to Start Page", 
                        command=lambda: controller.show_frame(StartPage))
        backbutton.place(x=100,y=50,width=200,height=44)

class PageTwo(tk.Frame):

    def get_id(self):
        return(PageOne.praiseid)

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)


        self.location = 'C:/Users/XXXXXXX/Documents/pic'+str(self.get_id())+'.gif'
        icon = tk.PhotoImage(file=self.location)
        self.IDlabel = tk.Label(self,image=icon)
        self.IDlabel.image = icon
        self.IDlabel.place(x=0,y=200,width=100,height=100)

1 个答案:

答案 0 :(得分:0)

来自PageOne的所选图片未在PageTwo上绘制,因为绘图功能已在__init__()函数中本地化,并且当PageTwotkraise()时,不会引发任何事件通过调用函数tkraise()来重绘。

问题1 - 在调用PageTwo的{​​{1}}时生成一个事件。

  

这里,Python的OOP将通过覆盖函数来解决   tkraise()中的class PageTwo

class PageTwo(tk.Frame):
...
    def tkraise(self):
        print('PageTwo.tkraise()')
        tk.Frame.tkraise(self)
        #  then call the drawing icon
        self.refresh_icon() #  see Problem 2

问题2 - 在class PageTwo的函数中本地化图标的绘制。

  

要考虑新选择的图标,请创建一个功能   refresh_icon()中的class PageTwo并从两者中调用它   __init__()tkraise()函数。

class PageTwo(tk.Frame):
...
    def refresh_icon(self):
        self.location = 'C:/Users/XXXXXXX/Documents/pic'+str(self.get_id())+'.gif'
        icon = tk.PhotoImage(file=self.location)
        self.IDlabel = tk.Label(self,image=icon)
        self.IDlabel.image = icon
        self.IDlabel.place(x=0,y=200,width=100,height=100)

__init__()函数的末尾添加。

class PageTwo(tk.Frame):
...
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        ...
        self.refresh_icon()

奖励1 - 为了防止在图片丢失的情况下出现异常,请先添加支票。

  

创建file_exists()函数,然后在加载前检查   PhotoImage()

def file_exists(filepath):     尝试:         fp_file = open(文件路径)         返回(真)     除了IOError:         返回(假)

refresh_icon()的函数class PageTwo中:

    self.location = 'C:/Users/XXXXXXX/Documents/pic'+str(self.get_id())+'.gif'
    if (file_exists(self.location)):
        icon = tk.PhotoImage(file=self.location)
        ...

Bonus 2 - 如果图片未加载,请清除当前IDlabel

  

Label中创建新的PageTwo时,变量   self.IDlabel将存储新图像而不删除旧图像。   在创建新功能之前,请调用destroy()功能。

添加变量self.IDlabel的声明,并将其分配给None函数中的__init__()。然后在

中调用destroy()
class PageTwo(tk.Frame):
...
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        ...
        self.refresh_icon()
        self.IDlabel = None
...
    def refresh_icon(self):
        self.location = 'C:/Users/XXXXXXX/Documents/pic'+str(self.get_id())+'.gif'
        if (self.IDlabel): # check label and destroy it
            self.IDlabel.destroy()
        if (file_exists(self.location)):
            ...