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

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

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!