在实现Sidebar按钮互斥效果时,出现了一个AttributeError错误:
AttributeError: 'SidebarManager' object has no attribute 'button_group'
问题出现在按钮信号连接的时机。在init_sidebar_button方法中,按钮的toggled信号被连接到on_button_toggled槽函数,但此时button_group属性可能还没有被初始化。
- 在
__init__方法中调用init_ui - 在
init_ui方法中创建按钮并调用init_sidebar_button init_sidebar_button方法中连接了按钮的toggled信号- 但是在信号连接时,
button_group还未被创建(在init_ui方法的最后才创建)
在__init__方法中提前初始化button_group属性,确保在按钮信号连接时该属性已存在。
在on_button_toggled方法中增加对button_group属性存在性的检查,防止在属性未初始化时访问。
def __init__(self, parent=None):
super().__init__(parent)
self.markdown_manager = MarkRenderManager()
self.parent = parent
self.app_style = AppStyle() # 添加样式实例
# 初始化按钮组
self.button_group = []
self.init_ui()
# 设置侧边栏背景色和样式
self.setStyleSheet(self.app_style.get_sidebar())def on_button_toggled(self, button, checked, icon_name, toggle_slot):
"""统一处理按钮切换事件"""
# 确保button_group已初始化
if hasattr(self, 'button_group') and self.button_group:
if checked:
# 实现按钮互斥效果
for other_button in self.button_group:
if other_button != button and other_button.isChecked():
other_button.setChecked(False)
# 更新图标为选中状态
button.setIcon(QIcon(get_icon_path(icon_name, selected=True)))
else:
# 更新图标为非选中状态
button.setIcon(QIcon(get_icon_path(icon_name, selected=False)))
else:
# 如果button_group未初始化,直接更新图标
if checked:
button.setIcon(QIcon(get_icon_path(icon_name, selected=True)))
else:
button.setIcon(QIcon(get_icon_path(icon_name, selected=False)))
# 调用具体的处理函数
toggle_slot(checked, icon_name)创建了测试脚本test_sidebar_bugfix.py来验证修复效果:
- 运行测试脚本,确认不再出现AttributeError错误
- 验证按钮互斥效果正常工作
- 验证默认状态正确设置
- 验证按钮图标切换正常
通过以上修复,解决了以下问题:
- ✅ 消除了AttributeError错误
- ✅ 保持了按钮互斥效果功能
- ✅ 确保了默认状态正确性
- ✅ 提高了代码的健壮性
本次bug修复通过提前初始化属性和增加安全检查,解决了由于属性初始化时机不当导致的运行时错误。修复方案简单有效,没有影响原有功能,同时提高了代码的健壮性和容错能力。