2013-09-20 2 views
4

Я новичок в Python и PyQt, и это мое первое приложение. В данный момент, когда нажата кнопка, toggleLED() проверяет self.LedOn, чтобы решить, включать ли светодиод.Отправить дополнительную переменную во время нажатия кнопки PyQt PushButton

class Screen(QWidget): 

    def initUI(self): 
     self.LedOn = 0 

     btn = QPushButton('Off', self) 
     btn.setCheckable(True) 
     btn.clicked.connect(self.toggleLED) 


    def toggleLED(self, pressed): 

     source = self.sender() 

     if self.LedOn: 
      source.setText('Off') 
      source.LedOn = 0 
      self.serial.write('L') 
     else:   
      source.setText('On') 
      source.LedOn = 1 
      self.serial.write('H') 

Проблема: Теперь, если мы хотим, чтобы управлять несколькими светодиодами и помнить их индивидуальное состояние переключения, что является лучшей практикой?

Я также не могу показаться, чтобы передать дополнительную ценность toggleLED() с btn.clicked.connect(self.toggleLED(btnNumber))

class Screen(QWidget): 

    def initUI(self): 

     btn1 = QPushButton('Off', self) 
     btn1.setCheckable(True) 
     btn1.LedOn= 0 
     btn1.clicked.connect(selftoggleLED(1)) 

     btn2 = QPushButton('Off', self) 
     btn2.setCheckable(True) 
     btn2.LedOn= 0 
     btn2.clicked.connect(selftoggleLED(2)) 


    def toggleLED(self, pressed, value): 

     source = self.sender() 

     if self.LedOn: 
      source.setText('Off') 
      self.serial.write(value) 
      self.serial.write('L') 
     else:   
      source.setText('On') 
      self.serial.write(value) 
      self.serial.write('H') 
+0

Я считаю, что вам нужно подклассифицировать QPushButton и каким-то образом переопределить нажатые или нажатые сигналы emmiters, чтобы вернуть желаемое значение, но я не могу найти, как это сделать в документации pyqt –

ответ

7

Вы можете использовать partial для этого:

from functools import partial 

btn1.clicked.connect(partial(self.toggleLED, 1)) 

Это позволяет передать несколько аргументов в функции.

0

QPushButton уже имеет checked boolean property, поэтому вам не нужно создавать другой. Есть два сигнала, излучающий кнопка:

  1. clicked, когда она нажата
  2. toggled, когда его состояние изменяется

Оба из них параметра передачи, который указывает на состояние кнопки щелкните кнопку. Но я думаю, что второе является более подходящим из-за его имени.

Так слот toggleLED должен выглядеть следующим образом:

def toggleLED(self, checked): 
    source = self.sender() 
    if checked: 
     source.setText('Off') 
     self.serial.write('L') 
    else:   
     source.setText('On') 
     self.serial.write('H') 

Обратите внимание, что только триггерные кнопки испускают toggled сигнал, но вы уже установить это свойство в коде:

def initUI(self): 
    btn1 = QPushButton('Off', self) 
    btn1.setCheckable(True) 
    btn1.toggled.connect(self.toggleLED) 

    btn2 = QPushButton('Off', self) 
    btn2.setCheckable(True) 
    btn2.toggled.connect(self.toggleLED) 
0
class Screen(QWidget): 

    def initUI(self): 

     btn1 = QPushButton('Off', self) 
     btn1.setCheckable(True) 
     btn1.value = 1 
     btn1.clicked.connect(selftoggleLED) 

     btn2 = QPushButton('Off', self) 
     btn2.setCheckable(True) 
     btn2.value = 2 
     btn2.clicked.connect(selftoggleLED) 


    def toggleLED(self, pressed): 

     source = self.sender() 

     if pressed: 
      source.setText('Off') 
      self.serial.write(source.value) 
      self.serial.write('L') 
     else:   
      source.setText('On') 
      self.serial.write(source.value) 
      self.serial.write('H') 
  1. Контролируемый QPushButton будет сохранять состояние, поэтому вам не нужно btn.LedOn.
  2. Используйте btn.value для хранения номера btn, поэтому вам не нужно отправлять дополнительный аргумент.
1

Вот решение, которое я всегда использую для этой работы.

class Screen(QWidget): 

    def initUI(self): 

     btn1 = QPushButton('Off', self) 
     btn1.setCheckable(True) 
     btn1.LedOn= 0 
     btn1.clicked.connect(selftoggleLED(1)) 

     btn2 = QPushButton('Off', self) 
     btn2.setCheckable(True) 
     btn2.LedOn= 0 

     # I am adding these lines----------------------- 

     # put all the btns in a list 
     btns = [btn1, btn2] 
     # connect each btn with the function and pass the same btn 
     map(lambda btn: btn.clicked.connect(lambda pressed: self.toggleLED(pressed, btn)), btns) 


    def toggleLED(self, pressed, clikedBtn): 

     if pressed: 
      clickedBtn.setText("On") 
      # set other variables you need 
     else: 
      clickedBtn.setText("Off") 
      # set other variables 
1

Чтобы передать несколько аргументов в функцию, вы можете использовать либо functools.partial() или lambda:

btn2.clicked.connect(lambda: selftoggleLED(2)) 

Читать discussion of both methods.

Смежные вопросы