从pyQT中的类访问方法

2024-09-24 06:29:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个带有两个简单按钮的小GUI来访问LabJAck IO模块。此模块用于打开或关闭与其相连的外部设备。我写了一个初始化设备的类和几个方法来处理设备的一些事情,其中两个是,打开和关闭。我之所以要用这种方式访问LAbJack是因为我希望代码是好的和整洁的,我将有几个设备连接到我的机器上,每个设备都有特定的IO命令。在

这是我的LabJAck代码:

import u3

class LabJack:
    def __init__(self):

        try:
            self.Switch = u3.U3()
        except:
            print "Labjack Error"

        #Define State Registers for RB12 Relay Card

        self.Chan0 = 6008
        Chan1 = 6009
        Chan2 = 6010
        Chan3 = 6011
        Chan4 = 6012
        Chan5 = 6013

    #Turn the channel on
    def IO_On(self,Channel):
        self.Switch.writeRegister(Channel,0)


    #Turn the channel off
    def IO_Off(self,Channel):   
        self.Switch.writeRegister(Channel,1)

    #The State of the Channel
    def StateSetting(self,Channel):
        self.Switch.readRegister(Channel)
        if Switch.readRegister(Channel) == 0:
            print ('Channel is On')
        else:
            print('Channel is Off')

    #Direction of Current Flow
    def CurrentDirection(self,Channel):
        self.Switch.readRegister(6108)
        print self.Switch.readRegister(6108) 

下面是我的GUI代码:

^{pr2}$

运行代码时,我得到以下错误:

Traceback (most recent call last):
  File "ALDSoftwareMainWindow.py", line 26, in <module>
    form = ALDMainWindow()
  File "ALDSoftwareMainWindow.py", line 20, in __init__
    self.Valve_ON.clicked.connect(self.ValveControl.IO_On(6008))
TypeError: connect() slot argument should be a callable or a signal, not 'int'

我不知道我做错了什么。任何帮助都将不胜感激。在

谢谢。在


Tags: 模块the代码ioselfinitondef
3条回答

您正在调用将按钮连接到的方法:

self.Valve_ON.clicked.connect(self.ValveControl.IO_On(6008))

这可能会解决您的问题:

^{pr2}$

lambda是一个匿名函数,它将延迟对方法IO_ON(6008)的调用,直到实际单击按钮为止。在

你对插槽/信号的工作原理有错误的理解。connect的参数必须是一个函数,该函数接受所连接到的信号发出的任何信号。在本例中,看起来您是从一个按钮连接到clicked信号(它不发出值)。因此,您需要将要调用的函数包装在一个不带参数的函数中。一种简单的方法是将函数包装在lambda函数中:

self.Valve_ON.clicked.connect(lmabda x=6008: self.ValveControl.IO_On(x))
self.Valve_OFF.clicked.connect(lambda x=self.ValveControl.Chan0: self.ValveControl.IO_Off(x))

它创建带有一个可选参数(默认值为所需值)的函数,因此它将作为无参数槽使用。在

使用默认参数将值绑定到中似乎有些奇怪,但它可以防止闭包出现一些奇怪的问题(请参见Python lambda closure scoping

另一种方法是使用^{}包装函数。在

1使用partial可能是最好的方法。在

self.Valve_ON.clicked.connect(functools.partial(self.ValveControl.IO_on,6008))

2使用QSignalMapper。在

相关问题 更多 >