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

时间:2017-07-01 15:35:36

标签: python qt pyqt eval

我在使用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_())

1 个答案:

答案 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