我很难尝试根据前一页点击的按钮在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)
答案 0 :(得分:0)
来自PageOne
的所选图片未在PageTwo
上绘制,因为绘图功能已在__init__()
函数中本地化,并且当PageTwo
为tkraise()
时,不会引发任何事件通过调用函数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)):
...