运行后显示AttributeError: 'MyWidget' object has no attribute 'data'
时间: 2023-09-05 08:07:38 浏览: 221
非常抱歉给你带来的困扰。在代码中,`self.data` 是在 `initUI()` 方法中定义的局部变量,无法在其他方法中访问。为了解决这个问题,我们可以将 `self.data` 定义为类的实例变量,使它在整个类中可见。
请使用以下修改后的代码:
```python
import sys
import json
from PyQt5.QtWidgets import QApplication, QWidget, QFormLayout, QLabel, QLineEdit, QPushButton
class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.data = {} # 定义实例变量,保存键值对数据
self.initUI()
def initUI(self):
layout = QFormLayout()
self.text_inputs = [] # 保存文本输入框的列表
# 从 JSON 文件中读取键值对
with open('/Users/jason/Desktop/manage.json') as f:
self.data = json.load(f)
# 遍历键值对,创建标签和文本输入框
for key, value in self.data.items():
key_label = QLabel(key) # 键作为标签显示
value_text = QLineEdit() # 创建文本输入框
# 设置默认文本和样式
value_text.setText(value)
value_text.setStyleSheet("color: gray")
# 连接焦点事件到槽函数
value_text.focusInEvent = lambda event, text=value_text: self.clearText(event, text)
layout.addRow(key_label, value_text)
self.text_inputs.append(value_text) # 将文本输入框添加到列表中
submit_button = QPushButton("提交")
submit_button.clicked.connect(self.submit) # 连接提交按钮的点击事件到槽函数
layout.addWidget(submit_button)
self.setLayout(layout)
self.setWindowTitle("JSON 数据展示")
def submit(self):
for text_input in self.text_inputs:
key = text_input.parent().layout().labelForField(text_input).text() # 获取对应的键
value = text_input.text() # 获取文本输入框的值
self.data[key] = value # 更新 JSON 数据
# 将更新后的 JSON 数据写回文件
with open('/Users/jason/Desktop/manage.json', 'w') as f:
json.dump(self.data, f)
print("JSON 数据已更新")
def clearText(self, event, text):
if text.text() == text.placeholderText():
text.clear() # 清空文本
text.setStyleSheet("color: black") # 恢复黑色文本颜色
# 调用默认的鼠标点击事件处理函数
QLineEdit.mousePressEvent(text, event)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MyWidget()
window.show()
sys.exit(app.exec_())
```
希望这次的修改可以解决问题。如果还有其他问题,请随时提问!
阅读全文