Обработка нажатия кнопки без создания функции

Рейтинг: 1Ответов: 1Опубликовано: 20.01.2023

В программе требуется, в случае нажатия на определенную кнопку, присвоить переменной значение.

Сейчас это выглядит так:

class mywindow(QtWidgets.QMainWindow):
    def __init__(self):
        global price
        super(mywindow, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.rb_Meat.toggled.connect(Meat)
        self.ui.rb_Emuls.toggled.connect(Emuls)
...
def Meat():
    global price
    price = 10

def Emuls():
    global price
    price = 20

Можно ли как-то упростить данный код, например не создавать функции?

Ответы

▲ 2Принят

Как вариант.

Класс QButtonGroup предоставляет контейнер для организации групп виджетов-кнопок.

from PyQt5 import QtWidgets, QtCore


class RadioButton(QtWidgets.QWidget):
    def __init__(self):
        super(). __init__()
        self.setWindowTitle("Radio Button")
        
        self.price = None                                              # !!!
        
        self.rb_1 = QtWidgets.QRadioButton("Овощи")
        self.rb_2 = QtWidgets.QRadioButton("Фрукты")
        self.rb_3 = QtWidgets.QRadioButton("Мясо")
        self.rb_4 = QtWidgets.QRadioButton("Молоко")

        buttons = (   # vvvv  <---------------------------- цена в копейках
            (self.rb_1, 1012), 
            (self.rb_2, 220),
            (self.rb_3, 3000),
            (self.rb_4, 4001),
        )
        
        vbox = QtWidgets.QVBoxLayout(self)
        self.optionGroup = QtWidgets.QButtonGroup()                # !!!          
        
        for button, id in buttons:
            vbox.addWidget(button)
            self.optionGroup.addButton(button, id)

        # для Qt >= 5.15:                                                # !!!                             # for Qt>=5.15:
        # self.optionGroup.idToggled.connect(self.getvalue)              # !!!
        # иначе если Qt < 5.15:                                          # !!!
        self.optionGroup.buttonToggled[int, bool].connect(self.getvalue) # !!!

    def getvalue(self, id, checked):                                     # !!!
        if checked:
            button = self.optionGroup.button(id)
            self.price = f"{id*0.01:>7.2f}"
            print(f"{button.text():>7} is checked, price = {self.price}")


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = RadioButton()
    w.show()
    sys.exit(app.exec_())

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