我有一个带有两个简单按钮的小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'
我无法弄清楚我做错了什么。任何帮助将不胜感激。
感谢。
答案 0 :(得分: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)
,直到实际点击按钮为止。
答案 1 :(得分:1)
您误解了插槽/信号的工作原理。 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)
另一种方法是使用functools.partial
来包装你的函数。
答案 2 :(得分:1)
1使用partial
可能是最佳方式。
self.Valve_ON.clicked.connect(functools.partial(self.ValveControl.IO_on,6008))
2使用QSignalMapper
。