Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 从QActionGroup获取选定的QAction文本标签_Python 2.7_Pyqt_Pyqt5 - Fatal编程技术网

Python 2.7 从QActionGroup获取选定的QAction文本标签

Python 2.7 从QActionGroup获取选定的QAction文本标签,python-2.7,pyqt,pyqt5,Python 2.7,Pyqt,Pyqt5,因此,我试图创建一个包含选项列表的PyQt设置选项卡,在该选项卡中,我只能从选项列表中选择一个选项。然后,应将所选选项的标签(例如“A”)复制到self.ID变量,以便将其用作后续函数的变量。以下是我在我的init函数中写的内容: self.ID = 0 self.prevMenu = QtWidgets.QMenu('ID tag', self) ag = QtWidgets.QActionGroup(self.prevMenu, exclusive=True)

因此,我试图创建一个包含选项列表的PyQt设置选项卡,在该选项卡中,我只能从选项列表中选择一个选项。然后,应将所选选项的标签(例如“A”)复制到self.ID变量,以便将其用作后续函数的变量。以下是我在我的init函数中写的内容:

    self.ID = 0
    self.prevMenu = QtWidgets.QMenu('ID tag', self)
    ag = QtWidgets.QActionGroup(self.prevMenu, exclusive=True)
    self.myID = ['A','B','C','D','E']

    for i in self.myID:
        Action = ag.addAction(QtWidgets.QAction(i, self.prevMenu, checkable=True))
        self.prevMenu.addAction(Action)
        Action.setText(i)
        Action.triggered.connect(lambda item=Action.text(): self.set_ID(Action.text()))
    self.menubar.addMenu(self.prevMenu)

    def set_ID(self, ID):
       print "Which: ", ID
       self.ID = ID
       print self.ID

现在我的问题是,当我运行这个时,无论我选择哪个标签,它只是列表中的最后一个元素('E'),被传输到self.ID。我知道这一定是关于我的变量是如何相互继承的,但我不知道如何继承。有人能帮我吗?

您的代码中有两个错误

  • 触发的
    信号具有
    已检查的
    参数,这意味着您使用的“item”参数将被触发的已检查状态“覆盖”
  • lambda函数的作用域不是函数本身的内部,您需要实际引用该值(可能是类属性)或将其作为lambda可选参数传递。这在使用for/while循环时非常重要
  • 您应该将循环的
    最后一行更改为:

    Action.triggered.connect(lambda checked, item=Action: self.set_ID(item.text())
    

    作为个人注意事项,如果您打算仅出于此目的使用
    set_ID
    方法,您可能更愿意将操作用作参数(并从方法中读取其文本),或者最终完全忽略参数,并使用
    QObject.sender()
    函数检索触发信号的操作。

    太好了,谢谢直到现在,我才在lambda函数中看到错误。我将查看QObject.sender()方法并对其进行更改。不客气!这是一个常见的错误,我也曾与之斗争过几次,现在我已经吸取了教训:-)