musicfair
@musicfair

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

[MicroPython] クラス内メソッドをコールバックに指定したい

解決したいこと

Raspberry Pi PicoでMicroPythonを使っています。

MicroPython v1.17 on 2021-09-02; Raspberry Pi Pico with RP2040

定期的に動作させる処理をクラス内に記述したいのですが
callback にクラス内のメソッドを指定する方法を教えてほしいです。

該当するソースコード

クラス内の ticktack メソッドが1秒ごとに呼ばれることを期待しています。

scheduler.py
import machine
from machine import Timer

class Scheduler():
    def start(self):
        tim = Timer()
        tim.init(freq = 1, mode = Timer.PERIODIC, callback = self.ticktack)

    def ticktack(self):
        print('timer in class')

if __name__ == '__main__':
    sch = Scheduler()
    sch.start()

発生している問題・エラー

callback に self.ticktack と指定すると下記のエラーになります

tim.init(freq = 1, mode = Timer.PERIODIC, callback = self.ticktack)
TypeError: function takes 1 positional arguments but 2 were given

callback に ticktack と指定すると下記のエラーになります

tim.init(freq = 1, mode = Timer.PERIODIC, callback = ticktack)
NameError: name 'ticktack' isn't defined
0

1Answer

def ticktack(self, t):
    print('timer in class')

または

tim.init(freq = 1, mode = Timer.PERIODIC,
    callback = lambda t: self.ticktack())

としてください。


TypeError: function takes 1 positional arguments but 2 were given

Timer はコールバックに引数を1つ与えて呼び出します。callback = self.ticktack とした場合、 ticktack メソッドに self とその引数の合計2つが与えられるために、仮引数の数と食い違ってエラーが出ています。仮引数を増やすか、メソッドを1引数の lambda でラップすれば解決します。

0Like

Comments

  1. @musicfair

    Questioner

    丁寧な回答ありがとうございます。
    仮引数を増やす方法で解決いたしました。

Your answer might help someone💌