Redamancy又在写BUG 2020-08-31 11:27 采纳率: 0%
浏览 821
已采纳

AttributeError: 'Main' object has no attribute 'params'

我写了一个带界面的接口测试的demo,但是在测试的时候遇到了问题,这里始终会提示错误:

Traceback (most recent call last):
  File "D:/PyCharm项目/UI_api/api_test.py", line 116, in start_request
    params=self.params
AttributeError: 'Main' object has no attribute 'params'

界面我是用qt designer设计的
以下是代码:

import traceback

from PySide2.QtCore import QFile
from PySide2.QtWidgets import QApplication, QMessageBox
from PySide2.QtUiTools import QUiLoader
import os
import sys
import json
import PySide2
import requests
from threading import Thread

"""初始化platform"""
dirname = os.path.dirname(PySide2.__file__)
plugin_path = os.path.join(dirname, 'plugins', 'platforms')
os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = plugin_path


class Main:

    def __init__(self):
        """初始化参数"""

        # 从文件中加载UI界面
        super().__init__()
        qfile_stats = QFile('main_api.ui')
        qfile_stats.open(QFile.ReadOnly)
        qfile_stats.close()
        # 从 UI 定义中动态 创建一个相应的窗口对象
        # 注意:里面的控件对象也成为窗口对象的属性了
        # 载入界面
        self.ui = QUiLoader().load(qfile_stats)

        """相关参数配置"""
        self.headers = {'content-type': 'charset=utf8'}
        self.s = requests.Session()

        '''添加按钮事件'''
        # 发送请求
        self.ui.req_btn.clicked.connect(self.start_request)
        # 清空url
        self.ui.clear_url_btn.clicked.connect(self.clear_url)
        # 添加属性
        self.ui.plus_btn.clicked.connect(self.plus_attr)
        # 删除属性
        self.ui.sub_btn.clicked.connect(self.sub_attr)
        # 响应消息清除
        self.ui.response_clear.clicked.connect(self.clear_mes_response)
        # 清除所有消息
        self.ui.all_clear_btn.clicked.connect(self.clear_all)

        '''添加输入框事件'''
        # url输入框
        self.url_text = ''
        self.ui.url_edit.textChanged.connect(self.handle_url_text)
        # 消息体输入框
        self.edit_text = ''
        self.ui.textEdit.textChanged.connect(self.handle_text_edit)
        if self.edit_text != '':
            # 生成请求消息参数
            self.params = json.loads(self.edit_text)

        '''添加下拉框事件'''
        self.method = ''
        self.ui.req_method.currentIndexChanged.connect(self.handle_selection)

    def _print_response(self, response):
        """输出response"""
        self.ui.show_res_text.append("===========  响应消息  ===========\n")
        for k, v in response.headers.items():
            self.ui.show_res_text.append(f'{k}: {v}')
        self.ui.show_res_text.append('\n')
        self.ui.show_res_text.append("===========  网页内容  ============\n")
        self.ui.show_res_text.append(response.content.decode('utf8'))
        self.ui.show_res_text.ensureCursorVisible()

    '''输入框事件操作'''

    def handle_url_text(self):
        """获取url中的地址"""
        self.url_text = self.ui.url_edit.text()

    def handle_text_edit(self):
        """消息体内容处理"""
        # 获取消息体内容
        self.edit_text = self.ui.textEdit.toPlainText()

    '''按钮事件操作'''

    def start_request(self):
        """发送请求"""
        if self.url_text == '':
            QMessageBox.warning(
                self.ui,
                '出错',
                '地址不存在,请输入正确地址'
            )
        elif self.method == 'GET':
            try:
                response = self.s.get(url=self.url_text,
                                      param={
                                          'action': 'list_medicine',
                                          'pagesize': 10,
                                          'pagenum': 1,
                                          'keywords': '',
                                      }
                                      )
                self._print_response(response)
            except:
                self.ui.show_res_text.append(traceback.format_exc())
        elif self.method == 'PUT':
            pass
        elif self.method == 'POST':
            response = self.s.post(url=self.url_text,
                                   headers=self.headers,
                                   params=self.params
                                   )
            self._print_response(response)
        elif self.method == 'DELETE':
            pass

    def clear_url(self):
        """url框清除内容"""
        if self.url_text == '':
            QMessageBox.warning(
                self.ui,
                '提示',
                '当前内容已经为空'
            )
        else:
            self.ui.url_edit.clear()

    def plus_attr(self):
        """添加一行"""
        self.ui.tableWidget.insertRow(0)

    def sub_attr(self):
        """删除一行"""
        self.ui.tableWidget.removeRow(0)

    def clear_mes_response(self):
        """响应消息清空"""
        if self.ui.show_res_text.toPlainText() == '':
            QMessageBox.warning(
                self.ui,
                '提示',
                '当前内容已经为空'
            )
        else:
            self.ui.show_res_text.clear()

    def clear_all(self):
        """清空所有的消息"""
        if self.url_text == '' and self.ui.show_res_text.toPlainText() == '':
            QMessageBox.warning(
                self.ui,
                '提示',
                '当前内容已经为空'
            )
        else:
            self.ui.url_edit.clear()
            self.ui.show_res_text.clear()

    '''下拉框选择'''

    def handle_selection(self):
        """获取下拉框的方法"""
        self.method = self.ui.req_method.currentText()


app = QApplication([])
main = Main()
main.ui.show()
sys.exit(app.exec_())

但是如果我将这里的params在里面定义好就不会报错了,请问这是为什么呢?
如:

params=import traceback

from PySide2.QtCore import QFile
from PySide2.QtWidgets import QApplication, QMessageBox
from PySide2.QtUiTools import QUiLoader
import os
import sys
import json
import PySide2
import requests
from threading import Thread

"""初始化platform"""
dirname = os.path.dirname(PySide2.__file__)
plugin_path = os.path.join(dirname, 'plugins', 'platforms')
os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = plugin_path


class Main:

    def __init__(self):
        """初始化参数"""

        # 从文件中加载UI界面
        super().__init__()
        qfile_stats = QFile('main_api.ui')
        qfile_stats.open(QFile.ReadOnly)
        qfile_stats.close()
        # 从 UI 定义中动态 创建一个相应的窗口对象
        # 注意:里面的控件对象也成为窗口对象的属性了
        # 载入界面
        self.ui = QUiLoader().load(qfile_stats)

        """相关参数配置"""
        self.headers = {'content-type': 'charset=utf8'}
        self.s = requests.Session()

        '''添加按钮事件'''
        # 发送请求
        self.ui.req_btn.clicked.connect(self.start_request)
        # 清空url
        self.ui.clear_url_btn.clicked.connect(self.clear_url)
        # 添加属性
        self.ui.plus_btn.clicked.connect(self.plus_attr)
        # 删除属性
        self.ui.sub_btn.clicked.connect(self.sub_attr)
        # 响应消息清除
        self.ui.response_clear.clicked.connect(self.clear_mes_response)
        # 清除所有消息
        self.ui.all_clear_btn.clicked.connect(self.clear_all)

        '''添加输入框事件'''
        # url输入框
        self.url_text = ''
        self.ui.url_edit.textChanged.connect(self.handle_url_text)
        # 消息体输入框
        self.edit_text = ''
        self.ui.textEdit.textChanged.connect(self.handle_text_edit)
        if self.edit_text != '':
            # 生成请求消息参数
            self.params = json.loads(self.edit_text)

        '''添加下拉框事件'''
        self.method = ''
        self.ui.req_method.currentIndexChanged.connect(self.handle_selection)

    def _print_response(self, response):
        """输出response"""
        self.ui.show_res_text.append("===========  响应消息  ===========\n")
        for k, v in response.headers.items():
            self.ui.show_res_text.append(f'{k}: {v}')
        self.ui.show_res_text.append('\n')
        self.ui.show_res_text.append("===========  网页内容  ============\n")
        self.ui.show_res_text.append(response.content.decode('utf8'))
        self.ui.show_res_text.ensureCursorVisible()

    '''输入框事件操作'''

    def handle_url_text(self):
        """获取url中的地址"""
        self.url_text = self.ui.url_edit.text()

    def handle_text_edit(self):
        """消息体内容处理"""
        # 获取消息体内容
        self.edit_text = self.ui.textEdit.toPlainText()

    '''按钮事件操作'''

    def start_request(self):
        """发送请求"""
        if self.url_text == '':
            QMessageBox.warning(
                self.ui,
                '出错',
                '地址不存在,请输入正确地址'
            )
        elif self.method == 'GET':
            try:
                response = self.s.get(url=self.url_text,
                                      param={
                                          'action': 'list_medicine',
                                          'pagesize': 10,
                                          'pagenum': 1,
                                          'keywords': '',
                                      }
                                      )
                self._print_response(response)
            except:
                self.ui.show_res_text.append(traceback.format_exc())
        elif self.method == 'PUT':
            pass
        elif self.method == 'POST':
            response = self.s.post(url=self.url_text,
                                   headers=self.headers,
                                   params=self.params
                                   )
            self._print_response(response)
        elif self.method == 'DELETE':
            pass

    def clear_url(self):
        """url框清除内容"""
        if self.url_text == '':
            QMessageBox.warning(
                self.ui,
                '提示',
                '当前内容已经为空'
            )
        else:
            self.ui.url_edit.clear()

    def plus_attr(self):
        """添加一行"""
        self.ui.tableWidget.insertRow(0)

    def sub_attr(self):
        """删除一行"""
        self.ui.tableWidget.removeRow(0)

    def clear_mes_response(self):
        """响应消息清空"""
        if self.ui.show_res_text.toPlainText() == '':
            QMessageBox.warning(
                self.ui,
                '提示',
                '当前内容已经为空'
            )
        else:
            self.ui.show_res_text.clear()

    def clear_all(self):
        """清空所有的消息"""
        if self.url_text == '' and self.ui.show_res_text.toPlainText() == '':
            QMessageBox.warning(
                self.ui,
                '提示',
                '当前内容已经为空'
            )
        else:
            self.ui.url_edit.clear()
            self.ui.show_res_text.clear()

    '''下拉框选择'''

    def handle_selection(self):
        """获取下拉框的方法"""
        self.method = self.ui.req_method.currentText()


app = QApplication([])
main = Main()
main.ui.show()
sys.exit(app.exec_())

但如果这里的params我改成一个写好的参数,而不是传进去就是对的,如直接params={'username': 'byhy', 'password': '88888888'}就不会报错,结果也能正常输出

  • 写回答

1条回答 默认 最新

  • jingluan666 2020-08-31 12:33
    关注
       if self.edit_text != '':
       # 生成请求消息参数
           self.params = json.loads(self.edit_text)
    

    是因为self.params在条件不满足时没有赋值,就不存在params

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd