Python 从PyQt中的QPushButton获取文本

Python 从PyQt中的QPushButton获取文本,python,qt,pyqt,pyqt4,qt-signals,Python,Qt,Pyqt,Pyqt4,Qt Signals,我正试图从QtGui.QPushButton对象列表中创建一个简单的键盘 class XKeyboard(QtGui.QWidget): '''Special virtual keyboard for any language.''' def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.MainLayout = QtGui.QVBoxLayout() self.Tex

我正试图从QtGui.QPushButton对象列表中创建一个简单的键盘

class XKeyboard(QtGui.QWidget):
  '''Special virtual keyboard for any language.'''
  def __init__(self, parent=None):
    QtGui.QWidget.__init__(self, parent)
    self.MainLayout = QtGui.QVBoxLayout()
    self.TextEntry = QtGui.QTextEdit()
    self.Keyboard = QtGui.QVBoxLayout()
    self.MainLayout.addWidget(self.TextEntry)
    self.MainLayout.addLayout(self.Keyboard)
    self.setLayout(self.MainLayout)

  def addRow(self, keys):
    layout = QtGui.QHBoxLayout()
    buttons = [QtGui.QPushButton(unicode(key)) for key in keys]
    for button in buttons:
      key = keys[buttons.index(button)]
      layout.addWidget(button)
      button.clicked.connect(
          lambda key: self.keyClick(key))
      self.keyClick(key)
    self.Keyboard.addLayout(layout)

  def keyClick(self, key):
    self.TextEntry.insertPlainText(key)

问题是lambda返回的是
False
而不是key。我做错了什么?

lambda

lambda key: self.keyClick(key)
相当于:

def dummy(key):
    self.keyClick(key)
因此,基本上您是从
clicked
signal接受一个参数,该参数
检查了按钮的状态,它是
False
,因为您没有可检查的按钮,并将其传递给
keyClick
方法
keyClick
方法在for循环中不接收
key
参数

可能的解决方案是编写
lambda
接受两个参数,其中一个参数的默认值为预期值:

lambda checked, key=key: self.keyClick(key)

你为什么需要做
key=key
是一个完全不同的主题。(与其他答案一起)相关主题可能会对此有所启发。

正确的方法是使用a,它正是针对这种情况设计的

这里有一种重新编写示例以使用它的方法:

class XKeyboard(QtGui.QWidget):
  '''Special virtual keyboard for any language.'''
  def __init__(self, parent=None):
    QtGui.QWidget.__init__(self, parent)
    self.MainLayout = QtGui.QVBoxLayout()
    self.TextEntry = QtGui.QTextEdit()
    self.Keyboard = QtGui.QVBoxLayout()
    self.MainLayout.addWidget(self.TextEntry)
    self.MainLayout.addLayout(self.Keyboard)
    self.setLayout(self.MainLayout)
    self.buttonGroup = QtGui.QButtonGroup(self)
    self.buttonGroup.buttonClicked[int].connect(self.keyClick)

  def addRow(self, keys):
    layout = QtGui.QHBoxLayout()
    for key in keys:
        key = unicode(key)
        button = QtGui.QPushButton(key)
        self.buttonGroup.addButton(button, ord(key))
        layout.addWidget(button)
    self.Keyboard.addLayout(layout)

  def keyClick(self, key):
    self.TextEntry.insertPlainText(unichr(key))

是的,伙计,这很有效!只有一个问题:如果我生成的信号不返回任何状态(如triggered()),我是否仍然需要lambda checked,key=key,或者我可以写lambda key=key?@ghostmansd:您应该(而不是“可以”)写
lambda key=key
,否则您将得到一个异常并声明参数不足。我将选中的
放在那里,因为您需要放弃从单击的
传递的参数。