Python中无法在一个类中访问另一个类变量的问题求助
我正在学习面向对象编程(OOP),开发一款包含主程序类(Program)、按钮类(Buttons)和输入框类(Entries)的计算器,但在Buttons类中尝试访问Entries的输入框内容时失败,相关代码如下:
原代码
主程序类
class Program(tk.Tk): def __init__(self, title, size): super().__init__() self.title(title) self.geometry(f"{size[0]}x{size[1]}") # Program elements split into widget type self.entries = Entries(self) self.output = Output(self) self.buttons = Buttons(self)
输入框类
class Entries(ttk.Frame): def __init__(self, parent): super().__init__(parent) self.place(x = 0, y = 0) # Calling widget generator and placer functions self.entryGen() self.entryPlacer() def entryGen(self): # Create entry widgets self.firstTerm = ttk.Entry(self) self.commonDifference = ttk.Entry(self) self.numberOfTerms = ttk.Entry(self) def entryPlacer(self): # Place entry widgets self.firstTerm.pack() self.commonDifference.pack() self.numberOfTerms.pack()
按钮类
class Buttons(ttk.Frame): def __init__(self, parent): super().__init__(parent) self.place(x = 0, y = 0) self.buttonGen() self.buttonPlacer() def buttonGen(self): self.clear = ttk.Button(self, text = "Clear", command = lambda: self.clear) self.calculate = ttk.Button(self, text = "Calculate", command = lambda: self.calculate) def buttonPlacer(self): self.clear.pack() self.calculate.pack() def clear(self): pass def calculate(self): entries = Entries() try: print(entries.firstTerm.get() + entries.commonDifference.get() + entries.numberOfTerms.get()) # Just some test code to see if it works, which it doesnt except: pass
核心问题分析
- 错误创建Entries实例:在
calculate方法中新建的Entries()是一个全新的空实例,和主程序中用户正在输入的self.entries不是同一个对象,自然无法获取输入内容。 - 按钮命令绑定错误:
lambda: self.clear这种写法仅返回方法对象,不会实际调用方法,应该直接绑定方法本身。 - 缺少有效引用:Buttons类没有持有主程序中已创建的Entries实例的引用,无法访问正确的输入框。
修复后的代码
主程序类(Program)
修改Buttons初始化逻辑,将已创建的Entries实例传入:
class Program(tk.Tk): def __init__(self, title, size): super().__init__() self.title(title) self.geometry(f"{size[0]}x{size[1]}") self.entries = Entries(self) # self.output = Output(self) # 假设Output类已实现 self.buttons = Buttons(self, self.entries) # 传入已创建的entries实例
按钮类(Buttons)
接收Entries实例引用,修正命令绑定并实现实际功能:
class Buttons(ttk.Frame): def __init__(self, parent, entries): super().__init__(parent) self.place(x = 0, y = 80) # 调整位置避免和输入框重叠 self.entries = entries # 保存主程序的entries实例引用 self.buttonGen() self.buttonPlacer() def buttonGen(self): self.clear = ttk.Button(self, text = "Clear", command = self.clear) # 直接绑定方法 self.calculate = ttk.Button(self, text = "Calculate", command = self.calculate) def buttonPlacer(self): self.clear.pack() self.calculate.pack() def clear(self): # 清空所有输入框 self.entries.firstTerm.delete(0, tk.END) self.entries.commonDifference.delete(0, tk.END) self.entries.numberOfTerms.delete(0, tk.END) def calculate(self): try: # 通过保存的引用获取输入值 first_term = self.entries.firstTerm.get() common_diff = self.entries.commonDifference.get() term_count = self.entries.numberOfTerms.get() print(f"输入值:{first_term}, {common_diff}, {term_count}") # 此处可添加具体计算逻辑 except Exception as e: print(f"计算出错:{e}") # 打印异常便于调试
输入框类(Entries)
保持逻辑不变,可微调布局提升体验:
class Entries(ttk.Frame): def __init__(self, parent): super().__init__(parent) self.place(x = 0, y = 0) self.entryGen() self.entryPlacer() def entryGen(self): self.firstTerm = ttk.Entry(self) self.commonDifference = ttk.Entry(self) self.numberOfTerms = ttk.Entry(self) def entryPlacer(self): self.firstTerm.pack(pady=2) self.commonDifference.pack(pady=2) self.numberOfTerms.pack(pady=2)
修复说明
- 传递实例引用:主程序将已创建的Entries实例传给Buttons,确保Buttons操作的是用户正在使用的输入框对象。
- 修正命令绑定:直接将方法名赋值给
command,确保按钮点击时会执行对应方法。 - 添加异常调试信息:替换空的except块,打印异常信息便于定位问题。
- 调整组件位置:通过设置不同的
y坐标避免输入框和按钮重叠,提升操作体验。
内容的提问来源于stack exchange,提问作者user21937868
相关产品推荐
相关产品推荐

