質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1769閲覧

TypeError: main() takes no arguments (1 given)の消し方

dyrobin

総合スコア13

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/06/01 11:23

ラズパイのGPIOにタクトスイッチをつなぎ、スイッチが押された回数をカウントし、
表示するというプログラムを書きました。
どうにか成功したのですが、下記のようなエラーが出力されました。
pi@raspberrypi:~/dev $ python countup4.py
1回目
TypeError: main() takes no arguments (1 given)

エラーを消す方法をご教示頂けないでしょうか。

countup4.py

1# -*- encoding:utf-8 -*- 2import RPi.GPIO as GPIO 3import time 4GPIO.setmode(GPIO.BCM) 5GPIO.setup(27, GPIO.IN, GPIO.PUD_DOWN) 6 7count=0 8 9def main(): 10 try: 11 while True: 12 if GPIO.input(27): 13 global count 14 count += 1 15 print(str(count)+"回目") 16 time.sleep(0.25) 17 18 except KeyboardInterrupt: 19 GPIO.cleanup() 20 21GPIO.add_event_detect(27, GPIO.RISING, callback=main, bouncetime=1000) 22 23if __name__=='__main__': 24 main()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

GPIO.add_event_detect(27, GPIO.RISING, callback=main, bouncetime=1000)

だと、GPIO.RISINGがおきたとき、main(27)として呼び出されるからです。

消し方は、以下が妥当でしょう。

python

1def main(gpio_pin): 2 try: 3 while True: 4 if GPIO.input(gpio_pin): 5 global count 6 count += 1 7 print(str(count)+"回目") 8 time.sleep(0.25) 9 10 except KeyboardInterrupt: 11 GPIO.cleanup()

投稿2021/06/01 11:46

ppaul

総合スコア24666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dyrobin

2021/06/01 11:57

GPIO.setup(27, GPIO.IN, GPIO.PUD_DOWN) count=0 gpio_pin = 27 def main(27): try: while True: if GPIO.input(27): global count count += 1 print(str(count)+"回目") time.sleep(0.25) except KeyboardInterrupt: GPIO.cleanup() GPIO.add_event_detect(27, GPIO.RISING, callback=main, bouncetime=1000) if __name__=='__main__': main() 上記のように修正したコードを実行すると、下記のエラーが出力されました。 その他、ご意見頂けないでしょうか。 File "@@countup.py", line 11 def main(27): ^ SyntaxError: invalid syntax
guest

0

ベストアンサー

callbackを定義しているので、引数をかならず渡さないといけないと思います。
下記でいかがでしょうか?

python

1# 引数の名前はなんでも良いです。 2def main(param): 3 ~以下省略 4# 下記の処理はadd_event_detectで呼んでいるのでいらないかと思います。 5# (間違っていましたら申し訳ございません。) 6# if __name__=='__main__': 7# main()

投稿2021/06/01 11:39

m2l

総合スコア318

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dyrobin

2021/06/01 12:02

GPIO.setup(27, GPIO.IN, GPIO.PUD_DOWN) count=0 gpio_pin = 27 def main(param): try: while True: if GPIO.input(27): global count count += 1 print(str(count)+"回目") time.sleep(0.25) except KeyboardInterrupt: GPIO.cleanup() GPIO.add_event_detect(27, GPIO.RISING, callback=main, bouncetime=1000) ご指南頂いたコードを実行しましたが、下記のようになりました。 下記のようにコードが実行され、終了したようなイメージです。 その他、ご意見頂けませんか。 pi@raspberrypi:~/dev $ python @@countup.py pi@raspberrypi:~/dev $ ちなみに、if~name~mainを消さずに実行すると下記のエラーが出力されました。 Traceback (most recent call last): File "@@countup.py", line 28, in <module> main() TypeError: main() takes exactly 1 argument (0 given)
m2l

2021/06/01 12:19

そうなんですね。。 下記のように待機するメソッドとカウントするメソッドを二分化するのはいかがでしょうか? def main(): try: while True: time.sleep(0.1) except KeyboardInterrupt: GPIO.cleanup() def count(hoge): if GPIO.input(27): global count count += 1 print(str(count)+"回目") time.sleep(0.25) GPIO.add_event_detect(27, GPIO.RISING, callback=count, bouncetime=1000) if __name__=='__main__': main()
dyrobin

2021/06/01 12:40

ご回答ありがとうございます。 分割して試しましたが、以下エラーとなりました。 Traceback (most recent call last): File "@@countup.py", line 20, in count count += 1 TypeError: unsupported operand type(s) for +=: 'function' and 'int' def count(): で引数(hoge)を削除して実行したところ下記となりました。 他に解決方法等ご教示頂けないでしょうか。。。 pi@raspberrypi:~/dev $ python @@countup.py TypeError: count() takes no arguments (1 given)
m2l

2021/06/01 12:45

申し訳ございません。。 function名(count)と変数被っているので下記でどうでしょうか? 名前等は適当なので動作確認後お好きな形にして頂いて構いません。 ・defの名前を下記にする def _count(hoge): ・add_event_detectを下記にする GPIO.add_event_detect(27, GPIO.RISING, callback=_count, bouncetime=1000)
dyrobin

2021/06/01 12:57

下記コードでうまくいきました! ご回答ありがとうございました! なぜこのような結果になるのか勉強進めます。 また機会がございましたらよろしくお願いいたします。 # -*- encoding:utf-8 -*- import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) GPIO.setup(27, GPIO.IN, GPIO.PUD_DOWN) count=0 gpio_pin = 27 def main(): try: while True: time.sleep(0.1) except KeyboardInterrupt: GPIO.cleanup() def _count(hoge): if GPIO.input(27): global count count += 1 print(str(count)+"回目") time.sleep(0.25) GPIO.add_event_detect(27, GPIO.RISING, callback=_count, bouncetime=1000) if __name__=='__main__': main()
m2l

2021/06/01 12:59

解決できてよかったです! 勉強頑張ってください!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問