Tkinter点击新增保存按钮后如何触发StartPage重新调用fetch_data刷新数据
解决方法
问题核心原因
DbConfig().fetch_data()当前写在StartPage的构造方法__init__中,该方法只会在程序启动、初始化所有页面时执行一次,后续切换页面不会重新触发,因此无法拉取到新增后的最新数据。
步骤1:抽离StartPage的数据刷新逻辑
把数据读取、UI渲染的逻辑从构造函数中抽为独立方法,同时新增可更新的UI组件用于展示数据:
class StartPage(Frame): def __init__(self, parent, controller): Frame.__init__(self, parent) self.controller = controller Label(self, text="StandBy").pack(side="top", fill="x", pady=10) # 新增列表组件用于展示学生数据 self.data_listbox = Listbox(self, width=60) self.data_listbox.pack(pady=10) Button(self, text="add student", command=lambda: controller.show_frames("NewStudentPage")).pack() # 初始化时加载一次数据 self.refresh_data() # 单独封装数据刷新方法 def refresh_data(self): # 清空列表旧数据 self.data_listbox.delete(0, END) # 拉取最新数据库数据 data = DbConfig().fetch_data() # 渲染新数据到列表 for item in data: self.data_listbox.insert(END, f"ID:{item[0]} | 课程:{item[1]} | 姓名:{item[2]} {item[3]}")
步骤2:修改页面切换逻辑,自动触发刷新
修改SampleApp类的show_frames方法,切换页面时判断目标页面是否存在刷新方法,存在则自动执行:
def show_frames(self, page_name): frame = self.frames[page_name] # 切换页面前触发对应页面的刷新方法 if hasattr(frame, 'refresh_data'): frame.refresh_data() frame.tkraise()
修改效果
完成以上修改后,不管是点击新增页的save按钮提交数据后跳转回首页,还是点击back按钮返回首页,都会自动调用refresh_data方法拉取最新数据并重新渲染,首页始终展示全量最新数据。
注:如果运行提示缺少
Listbox、END、Font等依赖,记得补充导入:from tkinter import Tk, Frame, Label, Button, Entry, StringVar, Listbox, END from tkinter.font import Font import sqlite3
内容的提问来源于stack exchange,提问作者user15368351
相关产品推荐
相关产品推荐

