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

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

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

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

Tkinter

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

Q&A

解決済

1回答

1409閲覧

tkinterのTksheetのセルを連想配列にいれたい

shinobuKouno

総合スコア31

Python 3.x

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

Tkinter

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

0グッド

1クリップ

投稿2023/03/15 12:33

編集2023/03/16 09:34

実現したいこと

tksheetの一つ一つのセルを連想配列にいれ、クリックしたときのイベントで
連想配列のアイテムを取得したいのですが、方法を教えてください。
keyはセル内の値ではなく、セルそのもので、ItemはSheet上には表示しない値です

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

TypeError: unhashable type: 'set'

該当のソースコード

Python

1def test(): 2 3 dic={} 4 5 def pr(e): 6 item = dic[sheet.get_selected_cells()] 7 print(item) 8 9 rt = tk.Tk() 10 rt.title('test') 11 rt.geometry("1800x1000") 12 13 frm_a = tk.Frame(rt) 14 frm_a.pack() 15 16 title_list = ['title' + str(x) for x in range(8)] 17 content_list = [['cell_' + '行' + str(j) + '_列_' + str(i) for i in range(10)] for j in range(300)] 18 19 sheet = tksheet.Sheet(frm_a, 20 width=1200, 21 height=900, 22 header_align='center', 23 headers=title_list, # タイトル 24 data=content_list, # テーブルのデータ 25 show_row_index=False) # 行番号を非表示 26 27 for row in range(len(content_list)): 28 for column in range(len(title_list)): 29 dic[sheet.get_selected_cells(row, column)] = '' 30 31 sheet.bind("<1>", pr) 32 sheet.pack() 33 34 print(dic) 35 36 rt.mainloop() 37test()

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

Python 3.10

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

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

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

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

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

guest

回答1

0

ベストアンサー

tksheetで一つ一つのセルを連想配列に入れ、クリックしたときのイベントで連想配列のアイテムを取得するには、以下のようにコードを修正できます。

1.セルのキーをタプル(行, 列)として使用します。
2.イベントハンドラの中で、sheet.get_currently_selected を使用して選択されたセルのタプル(行, 列)を取得します。
3.連想配列から取得したアイテムを表示します。
修正後のコードは以下の通りです。

python

1import tkinter as tk 2import tksheet 3 4def test(): 5 6 dic = {} 7 8 def pr(e): 9 selected_cell = sheet.get_currently_selected()[0] 10 item = dic[selected_cell] 11 print(item) 12 13 rt = tk.Tk() 14 rt.title('test') 15 rt.geometry("1800x1000") 16 17 frm_a = tk.Frame(rt) 18 frm_a.pack() 19 20 title_list = ['title' + str(x) for x in range(8)] 21 content_list = [['cell_' + '行' + str(j) + '_列_' + str(i) for i in range(10)] for j in range(300)] 22 23 sheet = tksheet.Sheet(frm_a, 24 width=1200, 25 height=900, 26 header_align='center', 27 headers=title_list, # タイトル 28 data=content_list, # テーブルのデータ 29 show_row_index=False) # 行番号を非表示 30 31 for row in range(len(content_list)): 32 for column in range(len(title_list)): 33 cell_key = (row, column) 34 dic[cell_key] = '' 35 36 sheet.bind("<1>", pr) 37 sheet.pack() 38 39 print(dic) 40 41 rt.mainloop() 42 43test() 44

上記のコードでは、セルがクリックされたときに、連想配列からアイテムを取得して表示します。ただし、現在はすべてのセルに対して空文字列を設定していますので、クリックしても空文字列が表示されます。必要に応じて、連想配列の値を変更してください。

投稿2023/03/18 04:28

編集2023/03/18 04:30
Shuhei

総合スコア16

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

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

shinobuKouno

2023/03/19 14:53

ありがとうございます。思い通りの動きが出来るようになりました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問