Вызов функции через цикл for с функциями в виде списка строк - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь написать приложение PyQt5.Все элементы списка в переменных списка являются объектами LineEdit формы.При вызове функции сброса я хочу установить для них конкретные значения, для которых я пытаюсь написать цикл for вместо жесткого кодирования.

Однако я не могу использовать элементы списка в переменных как объекты как они есть.Атрибуты объекта в другом файле и выполнение

self.eval(variables[i]).setText(default_0_values[i])

не работает , поскольку eval не является атрибутом self.Однако, если я запускаю

self.nGASLineEdit.setText(2)

, это работает .Но я не могу автоматизировать , и я застрял.Нужно обойти это.

from PyQt5 import QtCore,QtGui,QtWidgets,uic

variables=[
'nGASLineEdit','nDELTALineEdit','iMIPLineEdit','nDVECLineEdit','nSEEDLineEdit','eSTARTLineEdit','eTHRMLineEdit','eCUTLineEdit','nGAS1LineEdit','nGAS2LineEdit','nGAS3LineEdit','nGAS4LineEdit','nGAS5LineEdit','nGAS6LineEdit','fRAC1LineEdit','fRAC2LineEdit','fRAC3LineEdit','fRAC4LineEdit','fRAC5LineEdit','fRAC6LineEdit','tEMPLineEdit','tORRLineEdit','eFIELDLineEdit','bMAGLineEdit','bTHETALineEdit','iWRITELineEdit','iPENLineEdit','dETEFFLineEdit','eXCWGHTLineEdit','kGASLineEdit','lGASLineEdit','lCMPLineEdit','lRAYLineEdit','lPAPLineEdit','lBRMLineEdit','iECASCLineEdit'
]

default_0_values=[
2,100,5,1,0,1.0,1.5,2.0,
2 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
]

class Window(QtWidgets.QMainWindow):
    def __init__(self):
        super(Window,self).__init__()
        uic.loadUi('main.ui',self)
        self.pushButton_2.clicked.connect(lambda: self.reset())

    def select_func(self,func_name):
        return func_name

    def reset(self):
        global variables
        global default_0_values
        for i in range(len(variables)):
            self.eval(variables[i]).setText(default_0_values[i])




if __name__=='__main__':
    import sys
    app=QtWidgets.QApplication(sys.argv)
    window=Window()
    window.show()
    sys.exit(app.exec())

Файл пользовательского интерфейса в формате .ui

Файл пользовательского интерфейса в формате .py

1 Ответ

0 голосов
/ 04 июня 2018

Использование eval - плохая практика программирования, и в этом случае в ней нет необходимости, кроме ввода self.eval(...), они указывают, что eval является функцией класса Window, и, очевидно, это не так. С другой стороныесли вы только читаете переменные, нет необходимости использовать global.Вместо этого мы можем использовать getattr(), как показано ниже:

from PyQt5 import QtCore,QtGui,QtWidgets,uic

variables=['nGASLineEdit','nDELTALineEdit','iMIPLineEdit','nDVECLineEdit','nSEEDLineEdit','eSTARTLineEdit','eTHRMLineEdit','eCUTLineEdit','nGAS1LineEdit','nGAS2LineEdit','nGAS3LineEdit','nGAS4LineEdit','nGAS5LineEdit','nGAS6LineEdit','fRAC1LineEdit','fRAC2LineEdit','fRAC3LineEdit','fRAC4LineEdit','fRAC5LineEdit','fRAC6LineEdit','tEMPLineEdit','tORRLineEdit','eFIELDLineEdit','bMAGLineEdit','bTHETALineEdit','iWRITELineEdit','iPENLineEdit','dETEFFLineEdit','eXCWGHTLineEdit','kGASLineEdit','lGASLineEdit','lCMPLineEdit','lRAYLineEdit','lPAPLineEdit','lBRMLineEdit','iECASCLineEdit']

default_0_values=[2,100,5,1,0,1.0,1.5,2.0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

class Window(QtWidgets.QMainWindow):
    def __init__(self):
        super(Window,self).__init__()
        uic.loadUi('main.ui',self)
        self.pushButton_2.clicked.connect(self.reset)

    def reset(self):
        for le, val in zip(variables, default_0_values):
            getattr(self, le).setText(str(val))

if __name__=='__main__':
    import sys
    app=QtWidgets.QApplication(sys.argv)
    window=Window()
    window.show()
    sys.exit(app.exec())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...