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

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

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

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

Tkinter

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

Q&A

解決済

2回答

1397閲覧

tkinter bind関数を実行させたい

tsuji__

総合スコア11

Python 3.x

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

Tkinter

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

0グッド

0クリップ

投稿2023/04/13 02:15

実現したいこと

Python tkinterのtreeviewにおいて選択した行を抽出するbind関数を実行させたい

前提

Python tkinter でtreeviewを作成し、Treeview内に全データのDataFrameを表示させて、表示されているデータを選択したときにbind関数を実行させて選択されたデータを抽出する機能を実装しようとしているのですがbind関数内で引数が定義されていないらしくエラーが発生してしまいます。

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

NameError: name 'tree' is not defined

該当のソースコード

Python3.6

1 2def select_record(event): 3 # 選択行の判別 4 record_id = tree.focus() 5 # 選択行のレコードを取得 6 record_values = tree.item(record_id, 'values') 7 print(record_values) 8 if tk.messagebox.showinfo(title="選択行の確認", 9 message="次の行が選択されました=> id:" 10 + record_values[0] 11 + ",USg:" + record_values[1] 12 + ",PS:" + record_values[2]): 13 tree.delete(record_id) 14 else: 15 pass 16def quit_me(root_window): 17 root_window.quit() 18 root_window.destroy() 19 20def data_choose(df, columns, data_length, cycletime): 21 df.insert(0, "id", np.arange(1, data_length+1, 1)) 22 columns.insert(0, "id") 23 root=tk.Tk() 24 root.geometry('500x600') 25 root.title('choose_data') 26 root.protocol('WM_DELETE_WINDOW', lambda :quit_me(root)) 27 frame=tk.Frame(root) 28 tree = ttk.Treeview(frame, columns=columns) 29 tree.bind("<<TreeviewSelect>>", select_record) 30 31 # 列の設定 32 tree.column('#0',width=0, stretch='no') 33 tree.column('id', anchor='center', width=80) 34 tree.column('USg',anchor='w', width=150) 35 tree.column('PS', anchor='center', width=100) 36 37 # 列の見出し設定 38 tree.heading('#0',text='') 39 tree.heading('id', text='id', anchor='center') 40 tree.heading('USg', text='USg', anchor='center') 41 tree.heading('PS',text='PS', anchor='center') 42 # レコードの追加 43 44 for i in range(len(df['USg'])): 45 tree.insert(parent='', index='end', values=(df['id'][i], "{:.6f}".format(df['USg'][i]), df['PS'][i])) 46 47 # スクロールバーの追加 48 scrollbar = ttk.Scrollbar(frame, orient=tk.VERTICAL, command=tree.yview) 49 tree.configure(yscroll=scrollbar.set) 50 51 label = tk.Label(frame, text='左クリックでデータを選択します') 52 label1 = tk.Label(frame, text='shift+左クリックで指定した範囲のデータを一括選択します') 53 label2 = tk.Label(frame, text='ctrl+任意のデータを複数選べます') 54 # ウィジェットの配置 55 56 frame.pack() 57 58 label.pack() 59 label1.pack() 60 label2.pack() 61 62 scrollbar.pack(side=tk.RIGHT, fill=tk.Y) 63 tree.pack(side=tk.TOP, fill=tk.BOTH, expand=1) 64 65 root.mainloop()

試したこと

29行目のselect_recordに引数を追加してみたり、partial関数を試したりしましたが
どれもうまくいきませんでした。
2行目のselect_record(event)をselect_record(event, tree)にしましたが、引数がうまく対応せずこちらもうまくいきませんでした。

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

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

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

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

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

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

guest

回答2

0

event.widgetに呼出元のコントロールが格納されているので、それを利用すればよいです。
参考:【Python tkinter】クリックされたボタンを関数内で判別しテキスト情報などを取得する(bind,event)

Python

1def select_record(event): 2 tree = event.widget 3 # 以下略

投稿2023/04/13 02:32

can110

総合スコア38256

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

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

0

自己解決

treeをグローバル変数にすることで解決しました

投稿2023/04/13 02:27

tsuji__

総合スコア11

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問