Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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 3.x PyQt5在循环中构建菜单_Python 3.x_Loops_Menu_Pyqt5 - Fatal编程技术网

Python 3.x PyQt5在循环中构建菜单

Python 3.x PyQt5在循环中构建菜单,python-3.x,loops,menu,pyqt5,Python 3.x,Loops,Menu,Pyqt5,我有以下在PyQt5中的按钮上构建菜单的示例。虽然这是可行的,但当你有数百个菜单要构建时,这是很麻烦的。有没有办法在for循环中实现这一点 inputMenu_0 = QMenu() inputMenu_0.triggered.connect(lambda x: self.inputPb_0.setText(x.text())) self.add_menu(self.inputs, inputMenu_0) self.inputPb_0.setMenu(input

我有以下在PyQt5中的按钮上构建菜单的示例。虽然这是可行的,但当你有数百个菜单要构建时,这是很麻烦的。有没有办法在for循环中实现这一点

    inputMenu_0 = QMenu()
    inputMenu_0.triggered.connect(lambda x: self.inputPb_0.setText(x.text()))
    self.add_menu(self.inputs, inputMenu_0)
    self.inputPb_0.setMenu(inputMenu_0)
使用上述代码段的工作示例

    #!/usr/bin/python3

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QMenu, QWidget
from PyQt5.QtGui import QIcon

class Window(QMainWindow):
    def __init__(self):
        super(Window, self).__init__()
        self.setGeometry(50, 50, 500, 300)
        self.setWindowTitle("PyQT5 Minimal!")
        self.central_widget = QWidget(self)
        self.central_widget.setFocus()
        self.setCentralWidget(self.central_widget)

        self.inputPb_0 = QPushButton('Button 0', self)
        self.inputPb_0.move(15, 10)
        self.inputPb_1 = QPushButton('Button 1', self)
        self.inputPb_1.move(15, 40)

        self.inputs = [{'Homing':['X Home', 'Y Home', 'Z Home']},
            {'Jog':['Jog A', 'Jog B', 'Jog C', 'Jog U', 'Jog V', 'Jog W', 'Jog X', 'Jog Y', 'Jog Z']},
            {'Coolant':['Flood', 'Mist']},
            {'Digital':['Digital 0', 'Digital 1', 'Digital 2', 'Digital 3']}
        ]

        inputMenu_0 = QMenu()
        inputMenu_0.triggered.connect(lambda x: self.inputPb_0.setText(x.text()))
        self.add_menu(self.inputs, inputMenu_0)
        self.inputPb_0.setMenu(inputMenu_0)

        inputMenu_1 = QMenu()
        inputMenu_1.triggered.connect(lambda x: self.inputPb_1.setText(x.text()))
        self.add_menu(self.inputs, inputMenu_1)
        self.inputPb_1.setMenu(inputMenu_1)

        self.show()

    def add_menu(self, data, menu_obj):
        if isinstance(data, dict):
            for k, v in data.items():
                sub_menu = QMenu(k, menu_obj)
                menu_obj.addMenu(sub_menu)
                self.add_menu(v, sub_menu)
        elif isinstance(data, list):
            for element in data:
                self.add_menu(element, menu_obj)
        else:
            action = menu_obj.addAction(data)
            action.setIconVisibleInMenu(False)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    GUI = Window()
    sys.exit(app.exec_())
此代码将运行,但连接将转到两个按钮的第二个。如果在按钮0中选择菜单项,则按钮1中的文本将发生更改

        self.inputMenu_0 = QMenu()
    self.inputMenu_1 = QMenu()
    for i in range(2):
        getattr(self, 'inputMenu_' + str(i)).triggered.connect(lambda x: getattr(self, 'inputPb_' + str(i)).setText(x.text()))
        self.add_menu(self.inputs, getattr(self, 'inputMenu_' + str(i)))
        getattr(self, 'inputPb_' + str(i)).setMenu(getattr(self, 'inputMenu_' + str(i)))
下面的代码段可以工作,但我不知道如何在循环中编写connect

    self.inputMenu_0 = QMenu()
self.inputMenu_0.triggered.connect(lambda x: self.inputPb_0.setText(x.text()))
self.inputMenu_1 = QMenu()
self.inputMenu_1.triggered.connect(lambda x: self.inputPb_1.setText(x.text()))
for i in range(2):
    #getattr(self, 'inputMenu_' + str(i)).triggered.connect(lambda x: getattr(self, 'inputPb_' + str(i)).setText(x.text()))
    self.add_menu(self.inputs, getattr(self, 'inputMenu_' + str(i)))
    getattr(self, 'inputPb_' + str(i)).setMenu(getattr(self, 'inputMenu_' + str(i)))

为了避免这些混淆,最好限制getattr的使用,这样我们就可以保留更可读的代码,从而减少混淆

范围(2)内的i的
:
button=getattr(self,“inputPb_{}”.format(i))
menu=QMenu()
menu.triggered.connect(lambda action,button=button:button.setText(action.text()))
self.add_菜单(self.inputs,菜单)
按钮。设置菜单(菜单)

“我试图使用getattr()[…]但出现错误。”->什么错误?如果你不说错误是什么,告诉我们你犯了错误有什么意义?我已经试了一到三个星期了,所以很难回忆起我试过的所有事情和我犯的所有错误。最后一段代码已经非常接近了。@eyilanesc非常感谢您!这正是我想弄明白的。我知道按钮可能是使这项工作成功的诀窍。