【发布时间】:2021-12-06 17:41:21
【问题描述】:
我有一个在 QT Designer 中设计的 PyQT UI,有 40 个图形(在不同的选项卡上),以及对 UI 中元素的大量重复引用。例如,以下唯一的文本字段,用于设置每个图形的标题。
# Tab 1
self.tab1_tl1.canvas.axes.set_title(self.tab1_tl1_title.text())
self.tab1_tl2.canvas.axes.set_title(self.tab1_tl2_title.text())
self.tab1_tl3.canvas.axes.set_title(self.tab1_tl3_title.text())
self.tab1_tl4.canvas.axes.set_title(self.tab1_tl4_title.text())
self.tab1_tl1.canvas.axes.set_ylabel(self.tab1_tl1_ylabel.text())
self.tab1_tl2.canvas.axes.set_ylabel(self.tab1_tl2_ylabel.text())
self.tab1_tl3.canvas.axes.set_ylabel(self.tab1_tl3_ylabel.text())
self.tab1_tl4.canvas.axes.set_ylabel(self.tab1_tl4_ylabel.text())
# Tab 2
self.tab2_tl1.canvas.axes.set_title(self.tab2_tl1_title.text())
self.tab2_tl2.canvas.axes.set_title(self.tab2_tl2_title.text())
self.tab2_tl3.canvas.axes.set_title(self.tab2_tl3_title.text())
self.tab2_tl4.canvas.axes.set_title(self.tab2_tl4_title.text())
self.tab2_tl1.canvas.axes.set_ylabel(self.tab2_tl1_ylabel.text())
self.tab2_tl2.canvas.axes.set_ylabel(self.tab2_tl2_ylabel.text())
self.tab2_tl3.canvas.axes.set_ylabel(self.tab2_tl3_ylabel.text())
self.tab2_tl4.canvas.axes.set_ylabel(self.tab2_tl4_ylabel.text())
您可以想象,代码变得非常冗长。有没有更有效的方法来遍历所有这些引用和字段?
【问题讨论】:
-
您可以使用
getattr和setattr例如或将您的元素存储在list等中。但一个好的解决方案也很大程度上取决于环境和您的个人偏好。 -
你应该分解更多。带有多个选项卡和图形的单个 ui 文件似乎不是一个好的设计解决方案。它应该是单独的小部件,尽可能小。
-
tab1_tl1对象是 Qt Designer 中提升的小部件吗?如果是这样,您可以使用带有正则表达式的QObject.findChildren 将它们全部提取到基于它们的objectName的列表中。然后您可以对其进行迭代并使用objectName来获取其他小部件,如下所示:title = getattr(self, f'{widget.objectName()}_title').text()。这可能会将整个代码减少到 3-4 行代码。
标签: python user-interface pyqt