基于类开发tkinter应用时如何不使用全局变量存储并获取表单输入值
解决方案
最优实现方式是将所有输入数据存储在顶层SampleApp类的实例属性中,你的所有子页面都持有controller(也就是SampleApp的实例引用),可以直接读写这个属性,完全不需要全局变量。
步骤1:修改SampleApp类,新增数据存储属性
在SampleApp的__init__方法中新增一个字典属性用来存储全应用的输入数据,同时可以加一个清空数据的方法适配你第四页的清空功能:
class SampleApp(tk.Tk): def __init__(self, *args, **kwargs): tk.Tk.__init__(self, *args, **kwargs) # 新增全局数据存储属性 self.app_data = {} # 原有代码不变 self.title_font = tkfont.Font(family='Helvetica', size=18, weight="bold", slant="italic") # ... 其余原有代码保持不变 # 新增清空数据的方法,供第四页清空功能调用 def clear_all_data(self): self.app_data.clear()
步骤2:修改各页面的saveInput方法,将数据写入全局存储
以PageOne为例,其余页面按照相同逻辑修改即可:
class PageOne(tk.Frame): # 原有__init__代码不变 def saveInput(self, *args): entries = [] for arg in args: entries.append(arg.get()) # 将数据写入顶层app的存储字典,键名可以自定义方便区分不同页面的数据 self.controller.app_data['airport_info'] = entries print(entries)
PageTwo对应修改:
def saveInput(self, *args): entries = [] for arg in args: entries.append(arg.get()) self.controller.app_data['aircraft_info'] = entries print(entries)
PageThree对应修改:
def saveInput(self, *args): entries = [] for arg in args: entries.append(arg.get()) self.controller.app_data['price_info'] = entries print(entries)
步骤3:外部/其他页面访问数据
- 类外部访问:只要拿到
SampleApp的实例对象,直接读取app.app_data属性即可,比如主函数中:
if __name__ == "__main__": app = SampleApp() app.mainloop() # 窗口关闭后可以直接读取所有存储的数据 print(app.app_data)
- 其他页面内部访问:直接通过
self.controller.app_data读取即可,比如在PageThree中需要用到PageOne的机场数据计算利润,直接拿self.controller.app_data.get('airport_info')即可。
可选:适配第四页的清空功能
给PageFour的按钮绑定清空方法即可:
class PageFour(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) self.controller = controller label = tk.Label(self, text="This is page 4", font=controller.title_font) label.pack(side="top", fill="x", pady=10) # 新增清空数据按钮 clear_btn = tk.Button(self, text="清空所有已保存数据", command=lambda: controller.clear_all_data()) clear_btn.pack() button = tk.Button(self, text="Go to the start page", command=lambda: controller.show_frame("StartPage")) button.pack()
这种实现的优势:
- 完全规避全局变量,数据生命周期和应用实例绑定,多开应用实例也不会出现数据冲突
- 所有页面可以共享访问全量输入数据,不需要额外传参
- 数据管理集中,清空、修改都只需要操作顶层
app_data属性即可
内容的提问来源于stack exchange,提问作者user14915099
相关产品推荐
相关产品推荐

