tkinter类间数据传递:如何将StartPage的Entry值传递到PageOne
问题修复说明
你的代码存在4个可直接导致运行失败/逻辑不符合预期的问题:
- 语法层面:所有类下的方法缺少必要缩进,Python要求类内部的方法必须相对类缩进4个空格,否则直接触发语法错误
- 属性访问错误:
StartPage中创建Entry控件时链式调用了pack()方法,pack()返回值为None,同时你没有将Entry控件保存为实例属性,导致PageOne中无法通过start_page.entry访问到输入框,会抛出属性不存在异常 - 读取时机错误:你在
PageOne的__init__初始化方法中直接读取输入值,所有页面的初始化是程序启动时一次性完成的,此时用户还未输入内容,读到的永远是空值,需要将读取输入值的逻辑放到页面每次被展示时触发 - 多余导入:你导入了
typing_extensions下的IntVar,但实际使用的是tkinter自带的IntVar,该导入无实际作用还可能造成类型混淆
另外你已经给Entry绑定了tk.IntVar(),直接调用get()方法就能拿到int类型的数值,不需要手动做字符串转int的操作。
修复后完整代码
import tkinter as tk # python 3 from tkinter import font as tkfont class SampleApp(tk.Tk): def __init__(self, *args, **kwargs): tk.Tk.__init__(self, *args, **kwargs) self.title_font = tkfont.Font(family='Helvetica', size=18, weight="bold", slant="italic") container = tk.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): page_name = F.__name__ frame = F(parent=container, controller=self) self.frames[page_name] = frame frame.grid(row=0, column=0, sticky="nsew") self.show_frame("StartPage") def show_frame(self, page_name): '''Show a frame for the given page name''' frame = self.frames[page_name] # 页面展示前调用refresh方法更新内容 if hasattr(frame, 'refresh'): frame.refresh() frame.tkraise() def get_page(self, classname): '''Returns an instance of a page given it's class name as a string''' for page in self.frames.values(): if str(page.__class__.__name__) == classname: return page return None class StartPage(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) self.controller = controller label = tk.Label(self, text="Start Page: insert value", font=controller.title_font) label.pack(side="top", fill="x", pady=10) self.valore = tk.IntVar() # 将Entry保存为实例属性,分开写pack方法 self.entry = tk.Entry(self, textvariable=self.valore) self.entry.pack() button1 = tk.Button(self, text="Go to Page One", command=lambda: controller.show_frame("PageOne")) button1.pack() class PageOne(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) self.controller = controller self.label = tk.Label(self, text="This is page 1", font=controller.title_font) self.label.pack(side="top", fill="x", pady=10) self.value_label = tk.Label(self, text="") self.value_label.pack(pady=5) button = tk.Button(self, text="Go to the start page", command=lambda: controller.show_frame("StartPage")) button.pack() # 新增refresh方法,每次页面展示时自动调用,读取最新输入值 def refresh(self): start_page = self.controller.get_page("StartPage") # 直接通过IntVar拿int类型的值,不需要转格式 int_value = start_page.valore.get() print(f'The value stored in StartPage entry = {int_value}, 类型为{type(int_value)}') self.value_label.config(text=f"从StartPage拿到的数值为:{int_value}") if __name__ == "__main__": app = SampleApp() app.mainloop()
内容的提问来源于stack exchange,提问作者mandiatutti
相关产品推荐
相关产品推荐

