Как выполнить функцию используя её название как строку?

delta

Новичок
Пользователь
Апр 6, 2020
3
1
3
Добрый день, господа! В десктопном приложении на Qt5 есть множество однотипных полей, отличающихся только цифрой (например, lineEdit_1, lineEdit_2, lineEdit_3 и т.д.) Могу ли я в цикле подставлять вот эту цифру:

Python:
while i < 20
    lineEdit_[ i ].setText("")

Надеюсь понятно объяснил. Помню в FoxPro была функция макроподстановки: там было бы lineEdit_&i
Можно в Питоне такое организовать?
 
Последнее редактирование модератором:

delta

Новичок
Пользователь
Апр 6, 2020
3
1
3
Парни, спасибо большое, а то умаялся херней страдать: копировать и менять цифры - аж краснел от стыда :)
 
  • Мне нравится
Реакции: Student

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Вот пример с кнопкой и тремя полями:
Python:
import sys
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import QLineEdit


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName('MainWindow')
        MainWindow.resize(235, 180)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName('centralwidget')
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setObjectName('pushButton')
        self.line1 = QLineEdit(self.centralwidget)
        self.line1.resize(200, 32)
        self.line1.move(0, 50)
        self.line2 = QLineEdit(self.centralwidget)
        self.line2.resize(200, 32)
        self.line2.move(0, 80)
        self.line3 = QLineEdit(self.centralwidget)
        self.line3.resize(200, 32)
        self.line3.move(0, 110)

        MainWindow.setCentralWidget(self.centralwidget)
        self.retranslateUi(MainWindow)

    def buttonClicked(self):
        for i in range(1, 4):
            getattr(self, 'line' + str(i)).setText(str(i))

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate('MainWindow', 'MainWindow'))
        self.pushButton.setText(_translate('MainWindow', 'button'))
        self.pushButton.clicked.connect(self.buttonClicked)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
 
  • Мне нравится
Реакции: Mut3x, delta и Student

Student

throw exception
Команда форума
Администратор
Апр 2, 2020
195
103
43
Москва
Да, можно выполнить такой сценарий используя getattr()

Python:
getattr(self, 'lineEdit_%d' % 1)("Text...")

Пример:
Python:
class Go:

    def some1(self):
        print('some 1')

    def some2(self):
        print('Some 2')

    def do(self, num):
        getattr(self, 'some%d' % num)()


omg = Go()
omg.do(1) # Вывод: some 1

или
Python:
locals()['lineEdit_%d' % 1]()

Но, как я понимаю делать это ты будешь в классе.
 
Последнее редактирование:
  • Мне нравится
Реакции: delta

delta

Новичок
Пользователь
Апр 6, 2020
3
1
3
Да, можно выполнить такой сценарий используя getattr()

Python:
getattr(self, 'lineEdit_%d' % 1)("Text...")

или
Python:
locals()['lineEdit_%d' % 1]()

Но, как я понимаю делать это ты будешь в классе.
Капец, наверное я или тупой или уже старый :)
Student, покажи плиз, как это сделать:

i=1
while i < 10
self.chb_1.setVisible(True)


... ну и тут в цикле должно быть self.chb_1, self.chb_2, self.chb_n

делаю getattr(self, 'self.chb_%d' % i) - да, он подставляет туда цифру, а как ему вторую часть: .setVisible(True) подкинуть?
 

Student

throw exception
Команда форума
Администратор
Апр 2, 2020
195
103
43
Москва
Не нужно писать снова self в 'self.chb_%d' % i, оставь просто getattr(self, 'chb_%d' % i)(). @stud_55 выше показал в своем примере правильно, в методе buttonClicked.

Так же, не забудь, что это метод. Нужно в конце вставить скобки () или вызвать какой-то метод как у @stud_55 getattr(self, 'chb_%d' % i).setText("text").
 
  • Мне нравится
Реакции: delta

Student

throw exception
Команда форума
Администратор
Апр 2, 2020
195
103
43
Москва
Парни, спасибо большое, а то умаялся херней страдать: копировать и менять цифры - аж краснел от стыда :)

Не забудь выбрать ответ который тебе помог. Нужно нажать на иконку кубка слева от ответа. Тем самым вопрос будет иметь статус "решен".
 

Форум IT Специалистов