@ArkHiMed-tech

Питон выдает 'missing 1 required positional argument: 'self'', что делать?

Я знаю, что таких вопросов море, но сколько я не искал, не могу найти ответ.

Я пытаюсь сделать динамический таймер с обратным отсчетом, попутно выполняя код

У меня есть код:
class Class(object):
    <задание параметров окна и вызов функции startCard через self.button.clicked.connect()>
    def beginCard(self):
            <выполняемый код>
            self.threadBeginCard.join() 
    
    def startCard(self):
        <выполняемый код>
        self.threadBeginCard.start() 
          

    threadBeginCard = Timer(0.1, beginCard, args=None, kwargs=None)

class InputFrame(QtWidgets.QMainWindow, Class):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

def main():
    app = QtWidgets.QApplication(sys.argv)
    window = InputFrame()
    window.show() 
    app.exec() 

if __name__ == '__main__':
    main()


И в итоге я получаю ошибку missing 1 required positional argument: 'self' когда пытаюсь вызвать self.threadBeginCard.start()
  • Вопрос задан
  • 14643 просмотра
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
threadBeginCard = Timer(0.1, beginCard, args=None, kwargs=None)

Я без понятия, что такое Timer(), но могу догадаться, что он делает.
Он вызывает beginCard() без позиционных (args) или именованных (kwargs) параметров по наступлению некоторого события.
Проблема в том, что ты вызываешь метод класса, т.е. фактически Class.beginCard(). Ему нужно первым параметром передать экземпляр класса, т.е. self.
Если бы ты вызывал метод экземпляра, т.е.
c = Class()
c.beginCard()
То тогда self был бы подставлен автоматически.

Вывод: создать Timer() внутри экземплярного метода, и передать ему self.beginClass в качестве функции. Обрати внимание на отсутствие скобок.

Правда, я фз что произойдёт дальше - вызов join() мне не очень нравится, так как он заблокирует поток UI до момента завершения рабочего потока.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы