0

我有一个带有两个简单按钮的小 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 代码:

import re
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys
from LabJackIO import *
from Piezo902 import *

import ui_aldmainwindow

class ALDMainWindow(QMainWindow,ui_aldmainwindow.Ui_ALDMainWindow):

    def __init__(self, parent=None):
        super(ALDMainWindow,self).__init__(parent) 
        self.setupUi(self)

        self.ValveControl = LabJack()

        self.Valve_ON.clicked.connect(self.ValveControl.IO_On(6008))
       self.Valve_OFF.clicked.connect(self.ValveControl.IO_Off(self.ValveControl.Chan0))
        self.statusBar().showMessage('Valve Off')

app = QApplication(sys.argv)
app.setStyle('motif')
form = ALDMainWindow()
form.show()
app.exec_()

运行代码时出现以下错误:

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'

我无法弄清楚我做错了什么。任何帮助将不胜感激。

谢谢。

4

3 回答 3

1

1 使用partial也许是最好的方法。

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

2 使用QSignalMapper

于 2013-09-23T03:08:27.087 回答
1

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

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

可能这会解决您的问题:

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

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

于 2013-09-23T02:59:58.877 回答
1

您误解了插槽/信号的工作方式。to 的参数必须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 lambdaclosure scoping

另一种方法是使用functools.partial来包装你的函数。

于 2013-09-23T03:00:20.267 回答