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

如何在Tkinter切换视图时更新Listbox?

解决Tkinter切换视图时Listbox不更新的问题

我明白你的问题啦——现在你在StartPage添加新条目到tb1后,切换到PageOne时Listbox还是显示初始的旧数据,对吧?这是因为PageOne的Listbox只在初始化的时候加载了一次tb1的内容,之后切换视图并不会重新刷新它。

下面是简单有效的解决方法,我给你整理好了:

核心思路:切换页面时主动刷新Listbox

我们可以给PageOne添加一个刷新Listbox的方法,然后在主应用切换到这个页面时调用它,确保每次进入PageOne都能读取最新的tb1数据。

修改后的完整代码

# -*- coding: utf-8 -*-
from tkinter import *
tb1 = [["Kofola", "0,5","30"]]

class SeaofBTCapp(Tk):
    def __init__(self, *args, **kwargs):
        Tk.__init__(self, *args, **kwargs)
        container = Frame(self)
        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 (StartPage, PageOne):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")
        self.show_frame(StartPage)

    def show_frame(self, cont):
        frame = self.frames[cont]
        # 新增:切换到PageOne时触发刷新
        if cont == PageOne:
            frame.update_listbox()
        frame.tkraise()

class StartPage(Frame):
    def __init__(self, parent, controller):
        Frame.__init__(self,parent)
        label = Label(self, text="Start Page")
        label.pack(pady=10,padx=10)
        button = Button(self, text="Visit Page 1", command=lambda: controller.show_frame(PageOne))
        button.pack()
        button2 = Button(self, text="add", command=self.add)
        button2.pack()

    def add(self):
        tb1.append(["Radegast", "0,5","30"])
        print(tb1)

class PageOne(Frame):
    def __init__(self, parent, controller):
        Frame.__init__(self, parent)
        label = Label(self, text="Page One!!!")
        label.pack(pady=10,padx=10)
        button1 = Button(self, text="Back to Home", command=lambda: controller.show_frame(StartPage))
        button1.pack()
        self.bill=Listbox(self)
        self.bill.pack()
        # 初始化时加载一次初始数据
        self.update_listbox()

    # 新增:专门的Listbox刷新方法
    def update_listbox(self):
        # 先清空现有内容,避免重复添加
        self.bill.delete(0, END)
        # 遍历最新的tb1数据插入Listbox
        for item in tb1:
            co=" ".join(str(x) for x in item)
            self.bill.insert(END, co)

app = SeaofBTCapp()
app.mainloop()

关键修改点说明:

  1. 新增update_listbox方法:这个方法会先清空Listbox的旧内容,再重新插入tb1的最新数据,保证内容是实时的。
  2. 修改show_frame方法:当切换到PageOne时自动调用刷新方法,让每次页面切换都同步最新数据。
  3. 初始化时调用刷新:确保第一次进入PageOne时也能正确加载初始的tb1内容。

现在你运行修改后的代码,在StartPage点击"add"添加条目,再切换到PageOne,就能看到Listbox显示最新的内容了~

内容的提问来源于stack exchange,提问作者JimmySkluz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:44:47