#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. применяется ли это для всех видов виджетов, например, для использования всех параметров, которые отправляет сигнал параметр, который мы хотим в лямбда-функции?