首页 > 解决方案 > 如何将多个 QPushButtons 连接到一个方法?

问题描述

在这个应用程序中,我想将每个按钮连接到一种方法,该方法只显示按下按钮的文本。我认为我可以将按钮本身作为参数传递给方法,而不是为三个不同的按钮编写三种不同的方法:

import sys
from PyQt5 import QtWidgets as qtw


class MyWindow(qtw.QWidget):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.initUI()


    def initUI(self):

        grid = qtw.QGridLayout()
        self.setLayout(grid)

        self.btn_1 = qtw.QPushButton('1')
        self.btn_2 = qtw.QPushButton('2')
        self.btn_3 = qtw.QPushButton('3')

        self.btn_1.clicked.connect(self.print_to_console(self.btn_1))
        self.btn_2.clicked.connect(self.print_to_console(self.btn_2))
        self.btn_3.clicked.connect(self.print_to_console(self.btn_3))

        grid.addWidget(self.btn_1)
        grid.addWidget(self.btn_2)
        grid.addWidget(self.btn_3)
    
        self.show()


    def print_to_console(self, obj):

        obj = qtw.QPushButton()

        print(obj.text())


def main():
    app = qtw.QApplication(sys.argv)
    ex = MyWindow()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

但我在这里得到这个错误信息:

Traceback (most recent call last):
  File "c:\Users\fibi\Documents\PyQt5\nine buttons\NineButtons - Kopie.py", line 48, in <module> main()
  File "c:\Users\fibi\Documents\PyQt5\nine buttons\NineButtons - Kopie.py", line 43, in main  ex = MyWindow()
  File "c:\Users\fibi\Documents\PyQt5\nine buttons\NineButtons - Kopie.py", line 10, in __init__self.initUI()
  File "c:\Users\fibi\Documents\PyQt5\nine buttons\NineButtons - Kopie.py", line 22, in initUI  
    self.btn_1.clicked.connect(self.print_to_console(self.btn_1))
TypeError: argument 1 has unexpected type 'NoneType'

有人知道我做错了什么吗?感谢您的帮助。

标签: pythonpython-3.xpyqt5

解决方案


所有方法默认返回None。您需要将一个可调用对象传递给connect,以便在按下按钮时调用该方法。

所以进行以下更改(删除()after self.print_to_console):

    self.btn_1.clicked.connect(self.print_to_console)
    self.btn_2.clicked.connect(self.print_to_console)
    self.btn_3.clicked.connect(self.print_to_console)

您可以使用 获取发送信号的小部件QObject.sender()。所以你print_to_console可能是

 def print_to_console(self):
     obj = self.sender()
     print(obj.text())

推荐阅读