You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 23:45:05