我在使用Qt Designer名称rate_0到rate_6设计的表单上有一系列的旋转框。我想根据给定日期的星期几来参考其中一个旋转盒。
如果给定的spinbox的值可以称为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_())
答案 0 :(得分:1)
QWidgets最终应该存储为任何其他Python属性,所以我认为你要找的是内置函数getattr。在您的代码中,完整字符串在一行中看起来像这样:
d.strftime('%Y-%m-%d') + " " + str(getattr(self.ui, 'rate ' + str(d.weekday())).value())
如果你还想积极检查spinbox实际存在,它看起来像这样:
spinbox = getattr(self.ui, 'rate_' + str(d.weekday()), None)
if spinbox is None:
# Raise error or whatever
else:
# Launch message box here