2017-07-01 3 views
0

J'ai une série de spinbox sur un formulaire que j'ai conçu avec les noms Qt Designer rate_0 à rate_6. Je voudrais me référer à l'une de ces boîtes de sélection en fonction du jour de la semaine d'une date donnée.Utilisation de eval() pour faire référence aux widgets dans PYQT

Si une valeur de spinbox donnée peut être appelé, je sais que self.ui.rate_0.value() que je peux utiliser

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

mais de toute façon cela ne semble pas être la meilleure façon Qt Façon pythonique de le faire. Il semble aussi que je puisse traverser les enfants de layouts mais cela semble aussi désordonné.

Quelle est la meilleure façon de faire référence à des widgets sous une forme variable? Plus le code ci-dessous:

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_()) 

Répondre

1

QWidgets doivent à la fin être stockés comme tout autre attribut Python, donc je pense que ce que vous recherchez est la fonction intégrée getattr. Dans votre code, la chaîne complète ressemblerait à quelque chose comme cela en une ligne:

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

Si vous voulez également vérifier activement que le spinbox existe réellement, il ressemblerait à quelque chose comme ceci:

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