如何在Tkinter中点击Next/Back按钮切换Label控件展示的图片
Tkinter按钮切换图片问题修复方案
以下是修正后可正常运行的完整代码:
import tkinter as tk from tkinter import ttk from PIL import ImageTk, Image import os BASE_DIR = os.path.dirname(os.path.relpath(__file__)) image_dir = os.path.join(BASE_DIR, "my_training_face") class MainUi(tk.Tk): def listDir(dir): global names names = [] fileNames = os.listdir(dir) for fileName in fileNames: names.append(fileName) return names listDir(image_dir) def get_name(self, cmpt): try: return names[cmpt] except: return "Empty Case" def get_nbrHab(self): try: return len(names) except: return 0 def __init__(self, *args, **kwargs): tk.Tk.__init__(self, *args, **kwargs) self.geometry("300x400") self.geometry("+500+100") container = tk.Frame(self) container.pack(side="top", fill="both", expand=True) self.frames = {} frame = StartPage(container, self) self.frames[StartPage] = frame frame.place(relx=0, rely=0, relwidth=1, relheight=1) class StartPage(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) self.configure(background='white') # 初始化图片索引计数器 self.compteur = 0 self.label = tk.Label(self, text=controller.get_name(0)) self.label.pack(pady=10, padx=10) button1 = ttk.Button(self, text="Next", width=7, command = self.next_clicked) button1.place(relx=0.8, rely=0.9) button2 = ttk.Button(self, text="Back", width=7, command = self.back_clicked) button2.place(relx=0.1, rely=0.9) self.imgs = [] self.resizing = [] self.finals = [] try: img_count = controller.get_nbrHab() for i in range(img_count): img_path = os.path.join(image_dir, controller.get_name(i), "1.jpg") self.imgs.append(Image.open(img_path)) self.resizing.append(self.imgs[i].resize((160,120), Image.ANTIALIAS)) self.finals.append(ImageTk.PhotoImage(self.resizing[i])) except Exception as e: print(f"图片加载失败:{e}") return self.label_img = tk.Label(self, bg='white', image= self.finals[0]) self.label_img.image = self.finals[0] self.label_img.place(relx=0.21, rely=0.15) def next_clicked(self): # 边界判断避免索引越界 if self.compteur < len(self.finals) - 1: self.compteur += 1 self.label.config(text=MainUi.get_name(self,self.compteur)) self.label_img.config(image=self.finals[self.compteur]) # 保留图片引用避免被垃圾回收清除 self.label_img.image = self.finals[self.compteur] def back_clicked(self): # 边界判断避免索引为负 if self.compteur > 0: self.compteur -= 1 self.label.config(text=MainUi.get_name(self,self.compteur)) self.label_img.config(image=self.finals[self.compteur]) self.label_img.image = self.finals[self.compteur] app = MainUi() app.mainloop()
核心修改说明
- 将计数器
compteur改为StartPage类的实例属性,保证按钮点击方法可以正常修改和读取 - 修复图片加载循环的索引错误,用循环变量
i读取对应目录的图片,避免所有图片都加载第一张 - 给前后切换方法增加边界判断,避免索引越界报错
- 修复方法缩进错误,将
next_clicked和back_clicked改为StartPage的类方法,按钮绑定不需要多余的lambda - 优化路径拼接逻辑,使用
os.path.join避免不同系统的路径分隔符兼容问题
内容的提问来源于stack exchange,提问作者mouad touhafi
相关产品推荐
相关产品推荐

