如何在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()
关键修改点说明:
- 新增
update_listbox方法:这个方法会先清空Listbox的旧内容,再重新插入tb1的最新数据,保证内容是实时的。 - 修改
show_frame方法:当切换到PageOne时自动调用刷新方法,让每次页面切换都同步最新数据。 - 初始化时调用刷新:确保第一次进入PageOne时也能正确加载初始的
tb1内容。
现在你运行修改后的代码,在StartPage点击"add"添加条目,再切换到PageOne,就能看到Listbox显示最新的内容了~
内容的提问来源于stack exchange,提问作者JimmySkluz
相关产品推荐
相关产品推荐

