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

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

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

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

Tkinter

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

Q&A

解決済

1回答

580閲覧

Tkinterの右クリックメニューでマウスの所にあるウィジェットを取得したい

shinobuKouno

総合スコア31

Python 3.x

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

Tkinter

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

0グッド

0クリップ

投稿2023/02/18 02:47

実現したいこと

Tkinterの右クリックメニューで、マウスのポイントがある所の、ラベルウィジェットに書かれている文字を取得したいのですが、エラーがでて取得が出来ません。
マウスポイントのあるラベル文字の取得方法を教えて下さい

発生している問題・エラーメッセージ

TypeError: Create_Label.__init__.<locals>.<lambda>() missing 1 required positional argument: 'event'

該当のソースコード

modul1

1import tkinter as tk 2import modul2 3 4def main_screen(): 5 root = tk.Tk() 6 root.title("test") 7 root.geometry("640x400") 8 win = modul2.Test_A(root) 9 win.create_frame() 10 win.create_label_a() 11 root.mainloop() 12 13main_screen()

modul2

1import tkinter as tk 2import modul3 3 4# modul2.py 5class Test_A(tk.Frame): 6 def __init__(self, master=None): 7 super().__init__(master) 8 self.grid(sticky="nsew") 9 10 def create_frame(self): 11 self.frm_a = tk.Frame(self,width=400,height=200) 12 self.frm_a.grid(row=0, column=0) 13 14 def create_label_a(self): 15 create_label_a = Create_Label(self.frm_a) 16 17class Create_Label(tk.Frame): 18 19 def __init__(self, master): 20 super().__init__(master) 21 self.grid(sticky="nsew") 22 23 self.lbl_a = tk.Label(self, text='ラベルの1番目') 24 self.lbl_a.grid(row=0,column=0) 25 26 self.lbl_b = tk.Label(self, text='ラベルの2番目') 27 self.lbl_b.grid(row=1,column=0) 28 29 self.lbl_c = tk.Label(self, text='ラベルの3番目') 30 self.lbl_c.grid(row=2,column=0) 31 32 l = [self.lbl_a,self.lbl_b,self.lbl_c] 33 34 self.pmenu = tk.Menu(self, tearoff=0) 35 self.pmenu.add_command(label="ラベルの文字", command=lambda event: modul3.test_a(event)) 36 self.pmenu.add_command(label="ラベル名", command=lambda event: modul3.test_b(event)) 37 38 for v in l: 39 v.bind("<Button-3>", lambda event: modul3.showMenu(self, event))

modul3

1import tkinter as tk 2 3# modul3.py 4def showMenu(self,e): 5 self.pmenu.post(e.x_root, e.y_root) 6 7def test_a(event): 8 s = event.widget.cget('text') 9 print(s) # ラベルの文字を表示 10 11def test_b(event): 12 print(event.widget) 13

補足情報(FW/ツールのバージョンなど)

Python 3.10

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

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

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

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

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

guest

回答1

0

ベストアンサー

tk.Menu.add_command()command キーワードで指定する処理関数は引数を取りません。なので、modul3.showMenu() 内で tk.Menu.add_command() を実行する様にします。

modul2.py

python

1 l = [self.lbl_a,self.lbl_b,self.lbl_c] 2 menu = tk.Menu(self, tearoff=0) 3 for v in l: 4 v.bind("<Button-3>", lambda event: modul3.showMenu(menu, event))

modul3.py

python

1import tkinter as tk 2 3def showMenu(menu, e): 4 menu.delete(0, "end") 5 menu.add_command(label="ラベルの文字", command=lambda: test_a(e.widget)) 6 menu.add_command(label="ラベル名", command=lambda: test_b(e.widget)) 7 menu.post(e.x_root, e.y_root) 8 9def test_a(widget): 10 s = widget.cget('text') 11 print(s) 12 13def test_b(widget): 14 print(widget)

投稿2023/02/18 04:23

melian

総合スコア19992

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

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

shinobuKouno

2023/02/18 04:43

ありがごうございます。とても勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問