qq_41976422
Redamancy又在写BUG
采纳率50%
2020-08-31 11:27

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 jingluan666 7月前
       if self.edit_text != '':
       # 生成请求消息参数
           self.params = json.loads(self.edit_text)
    

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

    点赞 1 评论 复制链接分享