2017-07-01 12 views
0

私はQtデザイナーの名前rate_0〜rate_6で設計したフォームに一連のスピンボックスを用意しました。特定の日付の曜日に基づいて、これらのスピンボックスの1つを参照したいと思います。PYQTのウィジェットを参照するためにeval()を使用

与えスピンボックスの値が(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

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 
あなたのコードでは、完全な文字列は1行で次のようになります
関連する問題