使用 eval() 来引用 PYQT 中的小部件



我在我设计的表单上有一个系列的旋转框,rate_0 rate_6 Qt Designer名称。 我想参考基于给定日期的星期几的这些旋转盒之一。

如果给定的旋转框的值可以称为 self.ui.rate_0.value((,我知道我可以使用

eval("self.ui.rate_" + "0" + ".value()") 

但不知何故,这似乎不是最好的Qt方法或Pythonic方法。 似乎我也可以遍历布局的子项,但这似乎也很混乱。

以变量形式引用小部件的最佳方式是什么? 更多代码如下:

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import sys
from datetime import datetime, timedelta, time
from rate_bulk_edit import *
class Bulk_rates(QDialog):
def __init__(self, parent=None):
QDialog.__init__(self, parent)
self.ui = Ui_update_rates()
self.ui.setupUi(self)
self.ui.pb_update_rates.clicked.connect(self.update_rates)
def update_rates(self):
self.start_date = self.ui.start_date.date().toPyDate()
self.end_date = self.ui.end_date.date().toPyDate()
d = self.start_date - timedelta(days=1)
delta = timedelta(days=1)
while d <= self.end_date - timedelta(days=1):
d += delta        
QMessageBox.information(self, 
"Test", 
d.strftime('%Y-%m-%d') + " " + 
str(eval("self.ui.rate_" + str(d.weekday()) + ".value()")))
QMessageBox.information(self, "Rates...", "Rates updated!")

if __name__=="__main__":
app=QApplication(sys.argv)
myapp = Bulk_rates()
myapp.show()
sys.exit(app.exec_())

QWidgets最终应该存储为任何其他Python属性,所以我认为您正在寻找的是内置函数getattr。在您的代码中,完整字符串在一行中如下所示:

d.strftime('%Y-%m-%d') + " " + str(getattr(self.ui, 'rate ' + str(d.weekday())).value())

如果您还想主动检查旋转框是否确实存在,它将如下所示:

spinbox = getattr(self.ui, 'rate_' + str(d.weekday()), None)
if spinbox is None:
# Raise error or whatever
else:
# Launch message box here

最新更新