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

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

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

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

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Q&A

解決済

1回答

503閲覧

tkinter 簡潔にコードを書きたい

MATLIB

総合スコア27

Python 3.x

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

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

0グッド

0クリップ

投稿2020/11/16 06:07

A~Eのボタンがあり、実現したいことは下記の事を簡潔にコードを書きたいです。
<実現したい事:例>
Aボタンを押すとself.master.txt_dumyにAをインサートして、
Bボタンを押すとself.master.txt_dumyにBをインサートしたいです。

btn_click関数を使って、self.master.btn_1にcommand=self.btn_clickと作ってみたのですが、
この方法だと同じ処理をする関数をあとB~E分作らないといけません。

できれば、関数1つで実現したいのですが、良い方法はないでしょうか。

def btn_click(self): abc = self.master.btn_1['text'] self.master.txt_dumy.insert(tk.END,abc)
self.master.btn_1 = tkinter.Button(self.master,text='A',font=font2,bg="#faefe6",height=2, width=10,command=btn_click) self.master.btn_1.place(x=550, y=50) self.master.btn_2 = tkinter.Button(self.master,text='B',font=font2,bg="#faefe6",height=2, width=10) self.master.btn_2.place(x=550, y=100) self.master.btn_3 = tkinter.Button(self.master,text='C',font=font2,bg="#faefe6",height=2, width=10) self.master.btn_3.place(x=550, y=150) self.master.btn_4 = tkinter.Button(self.master,text='D',font=font2,bg="#faefe6",height=2, width=10) self.master.btn_4.place(x=450, y=100) self.master.btn_5 = tkinter.Button(self.master,text='E',font=font2,bg="#faefe6",height=2, width=10) self.master.btn_5.place(x=650, y=100)

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

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

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

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

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

guest

回答1

0

ベストアンサー

bind でイベントハンドラを登録すると、
引数の event.widget で自身のウィジェットを参照できます

python

1import tkinter as tk 2 3def btn_click(event): 4 button = event.widget 5 print(button["text"]) 6 7 8if __name__ == "__main__": 9 root = tk.Tk() 10 button = tk.Button(root, text="A") 11 button.bind("<ButtonRelease-1>", btn_click) 12 button.pack() 13 root.mainloop()

他の方法: functools.partial で引数を束縛する

command で登録する場合は、引数はありませんが、functools.partial を使うと
bind の場合とは異なり任意の数の引数を束縛できます。

但し、ボタン毎に関数と引数を関連付けしたオブジェクトを作る事になる為、
簡潔さでいうと (可能な場合は) bind を使った方が良いです。

python

1from functools import partial 2import tkinter as tk 3 4def btn_click(button): 5 print(button["text"]) 6 7 8if __name__ == "__main__": 9 root = tk.Tk() 10 button = tk.Button(root, text="A") 11 button["command"] = partial(btn_click, button) 12 button.pack() 13 root.mainloop()

NG: CANNOT ... コンストラクタで command を登録する時点ではインスタンスは生成されてない

python

1button = tk.Button(root, text="A", command=functools.partial(btn_click, button))

他の方法2: サブクラスを利用する

クラスを用いた汎用的な解決策

python

1import tkinter as tk 2 3class MyButton(tk.Button): 4 def __init__(self, *args, **kwargs): 5 super().__init__(*args, **kwargs) 6 7 def onclick(self): # インスタンス経由でアクセス 8 print(self["text"]) 9 10 11if __name__ == "__main__": 12 root = tk.Tk() 13 button = MyButton(root, text="A") 14 button["command"] = button.onclick 15 button.pack() 16 root.mainloop()

投稿2020/11/16 06:40

編集2020/11/16 08:12
teamikl

総合スコア8664

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

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

MATLIB

2020/11/16 08:17

bind でやってみたらできました。 しかし、この方法でボタンをDISABLEDにするとbtn_clickがはしってしまいます。 ネットで調べるとボタンクリックではなく、マウスをクリックしたかで判断しているので と記載されていました。 対処方はあるのでしょうか。
teamikl

2020/11/16 08:29

button['state'] の状態が normal か disabled の判別が必用になってきます。 その点に於いては、状態の判別が不要な command の方が適切ですね。
MATLIB

2020/11/16 08:41

やはりそうですよね。 commandにしてやってみます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問