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

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

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

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

Tkinter

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

Q&A

解決済

2回答

2432閲覧

tkinter:ループでボタンを作成し,ボタンごとに呼び出す関数を変える方法

Sayuki

総合スコア21

Python 3.x

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

Tkinter

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

0グッド

1クリップ

投稿2018/11/13 15:45

前提・実現したいこと

tkinterを使用しています.
ボタンを複数作るにあたり,ループで記述しました(ソースコード参照).
しかし,ボタンごとに呼び出す関数を変える方法が分からず困っております.
良い記述方法はないでしょうか.
よろしくお願いいたします.

該当のソースコード

python3

1import tkinter as tk 2import numpy as np 3from matplotlib import pyplot as plt 4from PIL import Image as img 5 6bTxtList = ["Plot", "Paint"] 7eInitList = [0, 0, 0] 8 9class Application(tk.Frame): 10 def __init__(self, master = None): 11 tk.Frame.__init__(self, master) 12 self.pack(expand = 1, fill = tk.BOTH, anchor = tk.NW) 13 self.createWidgets(bTxtList, eInitList) 14 15 def createWidgets(self, bTxtList, eInitList): 16 for eInit in eInitList: 17 e = tk.Entry() 18 e.insert(tk.END, eInit) 19 e.pack(expand = 1, fill = tk.BOTH, anchor = tk.NW) 20 21 for bTxt in bTxtList: 22 b = tk.Button(text = bTxt) 23 b.bind("<Button-1>", lambda evt: ??????) 24 b.pack(expand = 1, fill = tk.BOTH, anchor = tk.NW) 25 26 canvas = tk.Canvas(self, bg = 'white') 27 canvas.pack() 28 29 30root = tk.Tk().title("Visualizer for function") 31app = Application(master = root) 32app.mainloop()

試したこと

ソースコードのbTxtListをDictにして,keyをボタンのテキストにし,valueを呼び出す関数にして?????に入れればできるかなと考えたのですが,よくわからず挫折しました.

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

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

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

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

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

guest

回答2

0

bind()ではとりあえず共通の関数を定義し、その関数内にて 引数eventよりどのボタンが押されたかを判定して処理を別ける(必用に応じて関数を別ける)を行うとよいのではないでしょうか。

Python

1import tkinter as tk 2import numpy as np 3from matplotlib import pyplot as plt 4from PIL import Image as img 5 6bTxtList = ["Plot", "Paint"] 7eInitList = [0, 0, 0] 8 9class Application(tk.Frame): 10 def __init__(self, master = None): 11 tk.Frame.__init__(self, master) 12 self.pack(expand = 1, fill = tk.BOTH, anchor = tk.NW) 13 self.createWidgets(bTxtList, eInitList) 14 15 def createWidgets(self, bTxtList, eInitList): 16 for eInit in eInitList: 17 e = tk.Entry() 18 e.insert(tk.END, eInit) 19 e.pack(expand = 1, fill = tk.BOTH, anchor = tk.NW) 20 21 for bTxt in bTxtList: 22 b = tk.Button(text = bTxt) 23 # ボタンがおされたらとりあえず onNotify() を呼ぶ 24 b.bind("<Button-1>", self.onNotify) 25 b.pack(expand = 1, fill = tk.BOTH, anchor = tk.NW) 26 27 canvas = tk.Canvas(self, bg = 'white') 28 canvas.pack() 29 30 def onNotify(self, event): 31 # 押されたボタンのTEXTを取得 32 button_text = event.widget['text'] 33 # 押されたボタンはbTexListの何番目か? 34 idx = bTxtList.index(button_text) 35 # 必用に応じた関数を処理 36 (self.onPlot, self.onPaint)[idx]() 37 38 def onPlot(self): 39 print("onPlot()!!") 40 41 def onPaint(self): 42 print("onPaint()!!") 43 44root = tk.Tk().title("Visualizer for function") 45app = Application(master = root) 46app.mainloop()

投稿2018/11/13 23:24

magichan

総合スコア15898

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

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

Sayuki

2018/11/14 15:55

表現のレパートリーが増えました。 ありがとうございます!
guest

0

ベストアンサー

ボタン名とコールバック関数をタプルにまとめ、そのリストを利用する例です。

Python

1import tkinter as tk 2import numpy as np 3from matplotlib import pyplot as plt 4from PIL import Image as img 5 6def cbPlot(evt): 7 print('cbPlot') 8 9def cbPaint(evt): 10 print('cbPaint') 11 12bTxtList = [('Plot',cbPlot),('Paint',cbPaint)] # 名前とコールバック関数のタプルで管理 13eInitList = [0, 0, 0] 14 15class Application(tk.Frame): 16 def __init__(self, master = None): 17 tk.Frame.__init__(self, master) 18 self.pack(expand = 1, fill = tk.BOTH, anchor = tk.NW) 19 self.createWidgets(bTxtList, eInitList) 20 21 def createWidgets(self, bTxtList, eInitList): 22 for eInit in eInitList: 23 e = tk.Entry() 24 e.insert(tk.END, eInit) 25 e.pack(expand = 1, fill = tk.BOTH, anchor = tk.NW) 26 27 for bTxt in bTxtList: 28 b = tk.Button(text = bTxt[0]) # [0] = 名称 29 b.bind("<Button-1>", bTxt[1]) # [1] = コールバック関数 30 b.pack(expand = 1, fill = tk.BOTH, anchor = tk.NW) 31 32 canvas = tk.Canvas(self, bg = 'white') 33 canvas.pack() 34 35 36root = tk.Tk().title("Visualizer for function") 37app = Application(master = root) 38app.mainloop()

投稿2018/11/13 21:34

can110

総合スコア38256

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

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

Sayuki

2018/11/14 15:57

イメージ通りです! ありがとうございます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問