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

Python中无法在一个类中访问另一个类变量的问题求助

问题:无法在Buttons类中访问Entries类的输入框内容

我正在学习面向对象编程(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

核心问题分析

  1. 错误创建Entries实例:在calculate方法中新建的Entries()是一个全新的空实例,和主程序中用户正在输入的self.entries不是同一个对象,自然无法获取输入内容。
  2. 按钮命令绑定错误:lambda: self.clear这种写法仅返回方法对象,不会实际调用方法,应该直接绑定方法本身。
  3. 缺少有效引用: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)

修复说明

  1. 传递实例引用:主程序将已创建的Entries实例传给Buttons,确保Buttons操作的是用户正在使用的输入框对象。
  2. 修正命令绑定:直接将方法名赋值给command,确保按钮点击时会执行对应方法。
  3. 添加异常调试信息:替换空的except块,打印异常信息便于定位问题。
  4. 调整组件位置:通过设置不同的y坐标避免输入框和按钮重叠,提升操作体验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 15:53:35