V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
ALLROBOT
V2EX  ›  Python

问一个十分基础的问题, Python 类调用 pyqt 自定义组件类传参

  •  
  •   ALLROBOT · 86 天前 · 1226 次点击
    这是一个创建于 86 天前的主题,其中的信息可能已经有所发展或是发生改变。

    python 基础烂,pyqt 写一个界面调用自定义组件,结果 Pycharm 提示传参错误

    自定义组件类部分代码,Show_EMG.py

    from PyQt5 import QtCore
    from PyQt5.QtWidgets import QWidget
    from pyqtgraph import PlotWidget
    import pyqtgraph as pg
    import numpy as np
    
    
    # 绘图组件,输出 5~550 范围的数值
    class Plot_Show(QWidget):
        '''
        定义绘图时的参数:QWidget 、组件 y 作标、组件 x 作标、y 轴数据、组件宽高、组件对象文本
        Form,y,x,data,length = 1800, width = 250, high = 120, text = "sEMG Voltage"
        '''
        def __init__(self,Form,y,x,data,**kwargs):
            super().__init__(self,**kwargs)
            # length = 1800, width = 250, high = 120, text = "sEMG Voltage"
            self.Form=Form
            self.y=y
            self.x=x
            self.data=data
            self.length={"length":kwargs["length"] if kwargs.__contains__("length") else 1800}
            self.width={"width":kwargs["width"] if kwargs.__contains__("width") else 250}
            self.high={"high":kwargs["high"] if kwargs.__contains__("high") else 120}
            self.text={"text":kwargs["text"] if kwargs.__contains__("text") else "sEMG Voltage"}
            self.initUI()
         def xxx
         	....
    

    在别的类内实例化组件类并传参,main_plot.py

    from main_plot import EMG
    from pyqtgraph import PlotWidget
    import pyqtgraph as pg
    import numpy as np
    from PyQt5 import QtCore
    
    
    class Plot_Show(object):
        '''
        绘图组件,输出 5~550 范围的数值
        定义绘图时的参数:QWidget 、组件 y 作标、组件 x 作标、y 轴数据、组件宽高、组件对象文本
        Form,y,x,data,length = 1800, width = 250, high = 120, text = "sEMG Voltage"
        '''
        def __init__(self,Form,y,x,data,**kwargs):
            super().__init__(self,**kwargs)
            # length = 1800, width = 250, high = 120, text = "sEMG Voltage"
            self.Form=Form
            self.y=y
            self.x=x
            self.data=EMG()[data]
            self.length={"length":kwargs["length"] if kwargs.__contains__("length") else 1800}
            self.width={"width":kwargs["width"] if kwargs.__contains__("width") else 250}
            self.high={"high":kwargs["high"] if kwargs.__contains__("high") else 120}
            self.text={"text":kwargs["text"] if kwargs.__contains__("text") else "sEMG Voltage"}
            ....
    

    结果报错:

    Traceback (most recent call last):
      File "C:\Users\Administrator\PycharmProjects\pythonProject\main_plot.py", line 13, in <module>
        import Show_EMG
      File "C:\Users\Administrator\PycharmProjects\pythonProject\Show_EMG.py", line 1, in <module>
        from main_plot import EMG
      File "C:\Users\Administrator\PycharmProjects\pythonProject\main_plot.py", line 87, in <module>
        class Ui_Form(Show_EMG):
    TypeError: module() takes at most 2 arguments (3 given)
    

    是类的继承关系吗,不太明白怎么改,我自学 python 的,基础不太好😂

    im67
        1
    im67  
       86 天前
    module() takes at most 2 arguments (3 given):某个类只需要 2 个参数,但是给了 3 个
    ALLROBOT
        2
    ALLROBOT  
    OP
       86 天前
    Show_EMG.py 贴错代码了

    import Show_EMG
    from PyQt5 import QtCore, QtWidgets
    class Ui_Form(Show_EMG):
    def __init__(self):
    super().__init__()
    self.setupUi(self)



    def setupUi(self, Form):
    Form.resize(820, 454)
    Form.setObjectName("Form")
    self.plot1= Show_EMG.Plot_Show(Form=Form,y=10, x=10, data=0, text="sEMG1")
    ALLROBOT
        3
    ALLROBOT  
    OP
       86 天前
    屮,有图片没法上传,请不要在每一个回复中都包括外链,这看起来像是在 spamming ,太影响人心态了吧
    weyou
        4
    weyou  
       86 天前 via Android   ❤️ 1
    class Ui_Form(Show_EMG)
    模块当成类来继承?
    这代码实在是太乱了,看着辣眼睛
    passMeBy
        5
    passMeBy  
       86 天前
    是不是参数传递的是元组,没有用()包起来
    lookStupiToForce
        6
    lookStupiToForce  
       86 天前
    你确定是"import Show_EMG || class A(Show_EMG)"
    而不是"from Show_EMG import Plot_Show|| class A(Plot_Show)"或者直接 class A(Show_EMG.Plot_Show) ?

    从一个模块文件继承,我还真没见过这种用法
    你要不然搜搜 stackoverflow ?
    ALLROBOT
        7
    ALLROBOT  
    OP
       86 天前
    @lookStupiToForce #6 @passMeBy #5 @weyou #4

    我太菜了,对不起,下次一定看看 python 补补基础😥我把继承取消了,改 object ,直接实例化自定义组件类,结果还是报错,提示 TypeError: arguments did not match any overloaded call:


    lookStupiToForce
        8
    lookStupiToForce  
       86 天前
    真的是太乱了,不知道你是文件命名有重复还是咋滴,单独看这两个文件居然还有互相调用?这样很容易导致各种意料外的问题,建议如果真有互相调用,先去除互相调用确认继承依赖关系,把要调用的公共模块再独立出来成一个新的文件
    然后你发现没,报错已经不同了,所以不贴新的 traceback 信息我们也不清楚是啥引起的。而且也没在你的 main_plot.py 里找到 EMG 这个变量(你在 Show_EMG.py 引用的它),贴就贴全好伐?
    ALLROBOT
        9
    ALLROBOT  
    OP
       86 天前
    @lookStupiToForce #8 不好意思,我把调用的公共模块独立成新的文件了( EMG 暂时默认为 0 )

    把 Show_EMG 的**kwargs 参数去掉了,总算跑通(虽然跑了一会儿就自我崩溃了)😧

    ble.py 蓝牙读取的值暂存 EMG 数组,main_plot.py 实例化 Show_EMG 绘图类并输出,Show_EMG 类读取 ble.py 的蓝牙值

    ble.py


    Show_EMG


    main_plot.py
    ALLROBOT
        10
    ALLROBOT  
    OP
       86 天前
    我加下线程看看能解决自我崩溃不
    ec0
        11
    ec0  
       86 天前
    我试着运行了一下代码
    发现程序未响应
    因为你在 Show_EMG.py 的 initUI 函数里的 self.timer.start(10) 设置的 10 毫秒,太短了
    改成 100 程序就不会未响应了
    ALLROBOT
        12
    ALLROBOT  
    OP
       85 天前
    @ec0 #11 好吧。。。刷新率太快会使程序自我崩溃,感谢指出错误之处,本贴终结
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2583 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 08:08 · PVG 16:08 · LAX 01:08 · JFK 04:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.