pyqt: как связать кнопку с различными функциями в зависимости от того, сколько раз она была нажата - PullRequest
0 голосов
/ 14 февраля 2019

эй, я пытался связать свою кнопку с различными функциями, я определил новую кнопку следующим образом: первый раз нажал: print a;второй раз печатать б.Тем не менее, код не работает.независимо от того, сколько раз нажата кнопка, она печатает только «b».спасибо за помощь!

def a():
    print("a")
def b():
    print("b")

class nextbutton(QPushButton):

    window.count += 1
    print(window.count)

    def function(self):
        if window.count == 1:
            ui.next4.clicked.connect(a)
        else:
            ui.next4.clicked.connect(b)

mybutton = nextbutton()
ui.next4.clicked.connect(mybutton.function)

1 Ответ

0 голосов
/ 17 февраля 2019

Положение оператора

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

class nextbutton(QPushButton):

    window.count += 1
    print(window.count)

Две строки выше выполняются только тогда, когда кнопка создана строкой ниже.

mybutton = nextbutton()

Чтобы получить нужный эффект, переместите эти строки в метод function, который получает сигнал при нажатии кнопки.

class nextbutton(QPushButton):

    def function(self):
        window.count += 1
        print(window.count)
        if window.count == 1:
            ui.next4.clicked.connect(a)
        else:
            ui.next4.clicked.connect(b)

Вместо того, чтобы ссылаться на окно,Вы можете сохранить счетчик на самом объекте кнопки.Это позволит вам иметь несколько копий этой кнопки, каждая из которых отслеживает свой текущий счет и ведет себя соответственно.

class nextbutton(QPushButton):

    count = 0

    def function(self):
        self.count += 1

        if self.count == 1:
            ui.next4.clicked.connect(a)
        else:
            ui.next4.clicked.connect(b)

Несколько сигналов

Выше все равно не будет работать так, как вы этого хотите, однако,В следующем разделе функции a и b будут подключены к сигналу next4.Поскольку к одному и тому же сигналу может быть подключено несколько слотов, теперь это вызовет 3 поведения - повторный запуск

        if self.count == 1:
            ui.next4.clicked.connect(a)
        else:
            ui.next4.clicked.connect(b)

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

        if self.count == 1:
            a()
        else:
            b()
Некоторые другие предложения

Следующий фрагмент вашего кода удивителен.У вас есть кнопка, определенная в вашем пользовательском интерфейсе как ui.next4, но здесь вы создаете еще одну кнопку, просто чтобы удерживать функцию, которую вы используете для вызова другой функции.

mybutton = nextbutton()
ui.next4.clicked.connect(mybutton.function)

Вы можете исключить следующую кнопку исделайте его отдельной функцией:

def nextbutton_clicked(self):
    window.count += 1
    print(window.count)
    if window.count == 1:
        a()
    else:
        b()

Затем просто подключитесь следующим образом:

ui.next4.clicked.connect(nextbutton_clicked)

Наконец, я бы рекомендовал переименовать nextbutton в NextButton, поскольку это класс,Это всего лишь соглашение, но его полезно изучить, поскольку оно облегчает чтение вашего кода.Кроме того, я бы порекомендовал другое имя для вашего метода, которое вызывается кнопкой, button_clicked или аналогичным.

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