Python 3.x PyQt5在循环中构建菜单
我有以下在PyQt5中的按钮上构建菜单的示例。虽然这是可行的,但当你有数百个菜单要构建时,这是很麻烦的。有没有办法在for循环中实现这一点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
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非常感谢您!这正是我想弄明白的。我知道按钮可能是使这项工作成功的诀窍。