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

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 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序
  • ¥15 onvif+openssl,vs2022编译openssl64