PyQt5: Намерете кой QPushButton е щракнат

Имам няколко бутона и искам да знам кой бутон е щракнат. Открих грешката и знам, че функцията sender() трябва да работи с QWidget, а не с обекта клас, но не мога да разбера решението.

from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):

    def setupUi(self, MainWindow):
        """Widget code here"""
        self.btn1 = QtWidgets.QPushButton(self.widget)
        """Button properties here"""
        self.btn1.setObjectName("btn1")
        self.btn1.clicked.connect(self.btnListener)

        self.btn2 = QtWidgets.QPushButton(self.widget)
        self.btn2.setObjectName("btn2")
        self.btn2.clicked.connect(self.btnListener)

        """..... more buttons"""

    def btnListener(self):
        sender_button = self.sender() # Error Ui_MainWindow has no attribute sender
        print(sender_button)

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

person Enzy    schedule 23.04.2018    source източник
comment
Опитайте се да търсите обвързвания и събития   -  person Jakub Bláha    schedule 23.04.2018


Отговори (5)


Трябва да наследите Ui_MainWindow от MainWindow, за да работи това.

class Ui_MainWindow(MainWindow):
   ...
person MrLeeh    schedule 23.04.2018

С Qt 4.8 и python2.7 използвам partial, за да предам множество аргументи към сигнала.

from functools import partial
...

def initGui(self):
    ...
    self.btn1.clicked.connect(partial(self.btnListener, "btn1"))
    self.btn2.clicked.connect(partial(self.btnListener, "btn2"))
    ...

def btnListener(self, button_name):
    print('button_name {}'.format(button_name))
    ...

С този метод можете да знаете кой бутон е щракнат.

Надявам се, че това ще ви помогне да намерите същото в QT5.

person Jean-Charles Naud    schedule 17.07.2018

кодът по-долу работи добре.

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

class DlgMain(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Yeh lay")
        self.resize(400,400)

        self.btn1 = QPushButton("btn1", self)
        self.btn1.move(200,200)
        self.btn1.clicked.connect(self.btnListener)

        self.btn2 = QPushButton("btn2", self)
        self.btn2.move(200,230)
        self.btn2.clicked.connect(self.btnListener)

    def btnListener(self):
        rbt = self.sender()
        print(rbt.text())


if __name__ =='__main__':
    app = QApplication(sys.argv)
    dlgMain = DlgMain()
    dlgMain.show()
    sys.exit(app.exec_())
person Riz.Khan    schedule 06.03.2021

ето начин:

from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(Ui_MainWindow, self).__init__()
        self.setupUI()

    def setupUi(self, MainWindow):
        self.MainWindow = MainWindow
        """Widget code here"""
        self.btn1 = QtWidgets.QPushButton(self.widget)
        """Button properties here"""
        self.btn1.setObjectName("btn1")
        self.btn1.clicked.connect(self.btnListener)

        self.btn2 = QtWidgets.QPushButton(self.widget)
        self.btn2.setObjectName("btn2")
        self.btn2.clicked.connect(self.btnListener)

        """..... more buttons"""

    def btnListener(self):
        sender_button = self..sender()
        print(sender_button.text())

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
person Sean    schedule 24.06.2021

Направих това въз основа на предложението на @MrLeeh и проработи

from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):

def setupUi(self, MainWindow):
    self.MainWindow = MainWindow
    """Widget code here"""
    self.btn1 = QtWidgets.QPushButton(self.widget)
    """Button properties here"""
    self.btn1.setObjectName("btn1")
    self.btn1.clicked.connect(self.btnListener)

    self.btn2 = QtWidgets.QPushButton(self.widget)
    self.btn2.setObjectName("btn2")
    self.btn2.clicked.connect(self.btnListener)

    """..... more buttons"""

def btnListener(self):
    sender_button = self.MainWindow.sender()
    print(sender_button.text())

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
person Enzy    schedule 23.04.2018
comment
Ако някой даде отговор, който намирате за полезен, трябва да гласувате за и/или да го приемете. - person ekhumoro; 23.04.2018
comment
@ekhumoro получих идея от това предложение, но не съм използвал това предложение...няма смисъл да гласувам за - person Enzy; 25.04.2018