【问题标题】:Accessing specific button inside of a list访问列表中的特定按钮
【发布时间】:2023-03-04 14:18:01
【问题描述】:

我正在尝试为我的程序制作 GUI,但在尝试从点击的 QPushButton 访问文本时遇到了问题。

问题是,当我使用 for 循环遍历按钮列表时,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”。

【问题讨论】:

    标签: python user-interface pyqt pyqt5


    【解决方案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()
    

    【讨论】:

    • 这是否适用于各种小部件,例如使用信号发送的所有参数+我们想要在lambda函数中的参数?
    猜你喜欢
    • 2022-01-03
    • 2020-11-10
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    • 2022-10-07
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多