Доступ к определенной кнопке внутри списка

#python #user-interface #pyqt #pyqt5

#python #пользовательский интерфейс #pyqt #pyqt5

Вопрос:

Я пытаюсь создать графический интерфейс для своей программы и столкнулся с проблемой, пытаясь получить доступ к тексту из щелчка QPushButton .

Проблема в том, что когда я использую for-loop для перебора списка кнопок button.clicked.connect(function) , каждый щелчок обрабатывается как щелчок по последнему элементу (по крайней мере, я так думаю).

Вот пример кода

 from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QPushButton, QHBoxLayout
import sys


def main():
    app = QApplication(sys.argv)

    # main window
    win = QMainWindow()
    win.setGeometry(100, 100, 460, 80)
    win.setWindowTitle("My great app")

    # layout
    box = QWidget(win)
    box.setGeometry(0, 0, 460, 80)
    layout = QHBoxLayout(win)
    box.setLayout(layout)

    btns = []

    # creating 10 buttons
    for i in range(10):
        btn = QPushButton(str(i 1), box)
        btns.append(btn)
        layout.addWidget(btns[i], i)

    # accessing buttons text
    for btn in btns:
        btn.clicked.connect(lambda: print(btn.text()))

    win.show()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()
 

Если вы запустите программу и нажмете на любую кнопку, она будет печатать «10» каждый раз.

Ответ №1:

Вы должны прочитать здесь https://doc.qt.io/qt-5/qmainwindow.html#details и здесь https://doc.qt.io/qt-5/qabstractbutton.html#clicked

 import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, 
    QPushButton, QHBoxLayout


def main():
    app = QApplication(sys.argv)

    # main window
    win = QMainWindow()
    win.setGeometry(100, 100, 460, 80)
    win.setWindowTitle("My great app")

    # layout
    box = QWidget()                               #(win)
    box.setGeometry(0, 0, 460, 80)
    layout = QHBoxLayout(box)                     #(win)
#    box.setLayout(layout)                        # ---
    win.setCentralWidget(box)                     #    

    btns = []

    # creating 10 buttons
    for i in range(10):
        btn = QPushButton(str(i 1)) #, box)
        btns.append(btn)
        layout.addWidget(btns[i], i)

    # accessing buttons text
#       btn.clicked.connect(lambda: print(btn.text()))                 # ---
        btn.clicked.connect(lambda ch, text=btn.text(): print(text))   #    

    win.show()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()
 

введите описание изображения здесь

Комментарии:

1. применяется ли это для всех видов виджетов, например, для использования всех параметров, которые отправляет сигнал параметр, который мы хотим в лямбда-функции?