Как заставить PyQt5 QPushButton выполнять разные команды при разных нажатиях кнопок - PullRequest
0 голосов
/ 05 августа 2020

Я хочу sh, чтобы QPushButton выполнял разные действия при разных щелчках. При первом щелчке он должен выполнить одну команду, а при следующем щелчке - другую команду. Я пытался создать программу для этого, но она выполняет только одну команду, а не другую

мой код I:

import PyQt5.QtWidgets as pyqt
import sys

ongoing = False


class Stuff(pyqt.QWidget):
    def __init__(self):
        super().__init__()
        self.windows()

    def windows(self):
        w = pyqt.QWidget()
        layout = pyqt.QGridLayout()
        self.setLayout(layout)
        
        button = pyqt.QPushButton('click me', w)
        layout.addWidget(button)

        if not ongoing:
            button.clicked.connect(click_one)
        else:
            button.clicked.connect(click_two)
        self.show()
        w.show()


def click_one():
    global ongoing
    print('one')
    ongoing = not ongoing


def click_two():
    global ongoing
    print('two')
    ongoing = not ongoing


if __name__ == '__main__':
    app = pyqt.QApplication(sys.argv)
    x = Stuff()
    app.exec_()

Что мне делать, чтобы исправить это?

1 Ответ

1 голос
/ 05 августа 2020

Поскольку при инициализации класса значение ongoing равно False, сигнал нажатия кнопки подключается к click_one(). Подключите кнопку к начальному слоту, а затем вызовите нужную функцию на основе значения ongoing.

class Stuff(pyqt.QWidget):
    def __init__(self):
        super().__init__()
        self.windows()

    def windows(self):
        w = pyqt.QWidget()
        layout = pyqt.QGridLayout()
        self.setLayout(layout)
        
        button = pyqt.QPushButton('click me', w)
        layout.addWidget(button)

        button.clicked.connect(on_click)
        self.show()
        w.show()

def on_click():
    global ongoing
    if not ongoing:
        click_one()
    else:
        click_two()

Я предлагаю переписать код с функциями и ongoing переменной, принадлежащими классу. QWidget, назначенный переменной w, кажется избыточным, потому что QPushButton затем добавляется в макет класса, поэтому его родительский элемент в любом случае изменяется.

class Stuff(pyqt.QWidget):
    
    def __init__(self):
        super().__init__()
        self.ongoing = False
        self.windows()

    def windows(self):
        layout = pyqt.QGridLayout(self)
        button = pyqt.QPushButton('click me')
        layout.addWidget(button)
        button.clicked.connect(self.on_click)
        self.show()

    def on_click(self):
        self.click_one() if not self.ongoing else self.click_two()
        self.ongoing = not self.ongoing

    def click_one(self):
        print('one')

    def click_two(self):
        print('two')

Также вас может заинтересовать использование проверяемая кнопка .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...