Python类间变量传递报错:Dobot连接状态传递失败
问题分析
报错的核心原因是:connected_complete是dobot_automation类的实例属性(只有类的实例对象才拥有),但你直接通过类本身main_dobot.dobot_automation.connected_complete去访问,类本身并没有这个属性,所以触发AttributeError。
另外代码还有两个逻辑问题:
graphic类多重继承tk.Tk和dobot_automation不合理,GUI类和业务逻辑类应该用组合关系而非继承。- 点击按钮时创建了
dobot_automation实例,但没有保存这个实例,也没有同步更新button_connecting_signal的值,导致UI判断逻辑失效。
修复方案
以下是具体的代码修改步骤:
1. 修改tkinter_oop.py的graphic类
去掉不必要的多重继承,改为在类中持有dobot_automation的实例,并在按钮点击时正确获取连接状态:
import tkinter as tk from tkinter import ttk import main_dobot class graphic(tk.Tk): def __init__(self): super().__init__() # 初始化连接状态变量,默认0表示未尝试连接 self.button_connecting_signal = 0 # 提前创建tab和Label,避免每次点击重复创建 self.tab_2 = ttk.Frame(self) self.tab_2.pack(fill=tk.BOTH, expand=True) self.connecting = tk.Label(self.tab_2, text="N/A", font=("Inter", 25)) self.connecting.place(x=500, y=350) def button_connected_clicked(self): # 创建dobot_automation实例,__init__会自动设置connected_complete dobot_instance = main_dobot.dobot_automation() # 更新连接状态变量 self.button_connecting_signal = dobot_instance.connected_complete # 根据状态更新Label文本 if self.button_connecting_signal == 1: self.connecting.config(text="Connected") elif self.button_connecting_signal == 2: self.connecting.config(text="Not Connected")
2. 优化实例复用(可选)
如果需要复用同一个Dobot连接实例,避免每次点击都重新初始化设备,可以把dobot_instance设为graphic类的实例属性:
# 在graphic类的__init__中添加 self.dobot_instance = None # 修改button_connected_clicked方法 def button_connected_clicked(self): if not self.dobot_instance: self.dobot_instance = main_dobot.dobot_automation() self.button_connecting_signal = self.dobot_instance.connected_complete # 后续更新Label的逻辑不变
关键知识点说明
- 实例属性 vs 类属性:实例属性在
__init__中用self.xxx定义,属于每个类的实例;类属性直接在类体中定义,属于类本身。你需要的是实例属性,所以必须先创建类的实例才能访问。 - 组合优于继承:GUI类(
graphic)和业务逻辑类(dobot_automation)是不同职责的类,用组合(在GUI类中持有业务类的实例)比多重继承更清晰,避免继承带来的初始化混乱。
内容的提问来源于stack exchange,提问作者Chi
相关产品推荐
相关产品推荐

