2013-09-23 29 views
0

我有一個帶有兩個簡單按鈕的小GUI來訪問LabJAck IO模塊。該模塊用於打開或關閉連接到它的外部設備。我已經寫了一個類,在設備和幾種方法來做一些事情與設備兩個是打開和關閉。我以這種方式訪問​​LAbJack的原因是因爲我希望代碼更加美觀和整潔,並且我將有幾臺設備連接到我的機器,每臺設備都有特定的IO命令。從pyQT中的類訪問方法

這裏是我的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

0123ns也見http://stackoverflow.com/questions/18925241/send-additional-variable-during-pyqt-pushbutton-click – tacaswell

回答

1

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

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

2使用QSignalMapper

+0

謝謝你,完美的工作! –

+0

如何在Valve_On/Off.clicked.connect之後添加self.statusBar()。showMessage()以執行? –

1

你在呼喚你的按鈕連接方法:

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

也許這將解決你的問題:

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

lambda是一個匿名函數,將推遲您的方法的調用直到實際點擊按鈕爲止。

+0

這將在這種情況下工作,但要小心棘手的關閉陷阱。 – tacaswell

+0

喜歡什麼?我喜歡看似棘手的封閉陷阱,而我認真的做事,我不瞭解你(該死的最低崗位長度要求)。 – MadeOfAir

+0

看到我的答案中鏈接的問題。我正在做這樣的事情,但我從列表中的值生成'lambda',最後只綁定列表的_last_值。 – tacaswell

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來包裝你的函數。