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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

6150閲覧

python3.6 カウントするプログラムを作ったのですが、エラーがでます。

mint.cherry

総合スコア284

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2017/10/06 01:58

編集2017/10/06 03:07

プログラミング初心者です"(-""-)"
使用しているソフト:pycharm

ボタンが表示され、ボタンをクリックするたび1,2,3,4,5・・・・
と実行結果に表示されるものを作りたいのですがうまくいかないです。

import tkinter as tk root = tk.Tk() class App: count = 0 def btn_action(self): self.count += 1 return self.count app = App() btn = tk.Button(root,text="count") btn.bind("<Button-1>",app.btn_action()) btn.pack() root.mainloop()

ボタンを押した後のエラー

Exception in Tkinter callback Traceback (most recent call last): File "C:\Program Files\Python36\lib\tkinter\__init__.py", line 1699, in __call__ return self.func(*args) TypeError: 'int' object is not callable

どこが原因なのかわからないです。。。

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

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

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

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

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

guest

回答1

0

ベストアンサー

修正しました。下記のようにするといかがでしょうか。

python

1import tkinter as tk 2 3root = tk.Tk() 4 5class App: 6 count = 0 7 def btn_action(self, event): 8 self.count += 1 9 # コンソールへの出力 10 print(self.count) 11 # ボタンのラベル変更 12 event.widget.config(text="count: %s" % self.count) 13 14app = App() 15btn = tk.Button(root,text="count") 16btn.bind("<Button-1>",app.btn_action) 17 18btn.pack() 19root.mainloop()

bindの第2引数はコールバックしたいメソッドを指定します。
ご質問に記載のコードではメソッドの実行結果が渡されているため、エラーとなっています。

動きとしては下記のように扱われています。

python

1>>> app.btn_action()() 2Traceback (most recent call last): 3 File "<stdin>", line 1, in <module> 4TypeError: 'int' object is not callable

追記:
失礼しました。
Tkの実行確認までしていなかったのでお手数おかけしました。
最初の解答内容で実行した際はbtn_actionに引数が2つ渡されている、というエラーになったのではないかと思います。

上記コードでは期待の動作となるでしょうか。
このコードではbtn_actionメソッドからreturn文を削除させて頂いています。

投稿2017/10/06 02:34

編集2017/10/06 04:01
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

mint.cherry

2017/10/06 03:05

回答ありがとうございます。 上記のコードで試してみたのですが、同じエラーになります。 >>ご質問に記載のコードではメソッドの実行結果が渡されているため、エラーとなっています。 def btn_action(self): self.count += 1 return self.count この関数の実行結果が渡されているからエラーとなるってことですか?
退会済みユーザー

退会済みユーザー

2017/10/06 04:09

回答内容を修正しました。 bindで指定したコールバック関数では、値を返しても特に何も起こらないかと思いますので、回答ではreturn文を削除しています。
mint.cherry

2017/10/06 06:45

返信ありがとうございます。思って通りの動きになりました。 エラー同じではなかったです。すいません。 引数の中身を確認したくて以下のものを追加しましたがこれで引数の中身は確認できているのでしょうか? =================================== class App: count = 0 def btn_action(self,event): #引数の中身確認 print(self) print(event) #カウント self.count += 1 # コンソールへの出力 print(self.count) # ボタンのラベル変更 event.widget.config(text="count: %s" % self.count) =================================== 実行後3回ボタンを押した実行結果です。 =================================== <__main__.App object at 0x000002729F6F8A20> <ButtonPress event state=Lock num=1 x=23 y=11> 1 <__main__.App object at 0x000002729F6F8A20> <ButtonPress event state=Lock num=1 x=37 y=23> 2 <__main__.App object at 0x000002729F6F8A20> <ButtonPress event state=Lock num=1 x=37 y=21> 3
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問