python

tksheetでクリックしたセルの値を取得 -tkinter –

tksheetは便利ですが、ドキュメントがちょっと手抜きなところがあります。

色々試行錯誤して漸く使い方がわかってきました。

今回はクリックしたセルの値の取得方法を紹介します。

セルのクリックイベントを使う

公式ドキュメントを見ますと下記の様に書かれています。

Bind various table functionality to your own functions. To unbind a function either set func argument to None or leave it as default e.g. extra_bindings("begin_copy") to unbind"begin_copy".extra_bindings(bindings, func = “None”)


extra_bindingsでイベントを設定しておけば、funcで指定した関数を呼び出せるようです。
イベントは結構種類があるので割愛しますが、コピーやドラッグ、行列の削除など様々なものが
用意されています。

今回は"cell_select"を使ってクリックしたセルの値を取得していきます。

実際に取得してみる

別の記事で使ったコードに追加する形でイベントを追加してみます。

eventのメンバーにrowとcolumnの値がありますので、cellの値を取得するget_cell_data()を使って値を取得します。

  1. from tksheet import Sheet
  2. import tkinter as tk
  3. class sheetapp():
  4.     def __init__(self,frame) -> None:
  5.         self.frame = frame
  6.         self.sheet = Sheet(
  7.             self.frame,
  8.             )
  9.         self.sheet.enable_bindings()
  10.         self.sheet.extra_bindings(“cell_select”,func= self.get_cellvalue)
  11.         self.sheet.pack()
  12.     def set_value(self):
  13.         datalist = [
  14.             [“a1″,”b1″,”c1”],
  15.             [“a2″,”b2″,”c2”],
  16.             [“a3″,”b3″,”c3”],
  17.         ]
  18.         self.sheet.set_sheet_data(data = datalist)
  19.     def get_values(self):
  20.         data = self.sheet.get_sheet_data()
  21.         print(data)
  22.     def get_cellvalue(self, event):
  23.         print(“col :”,event.column,”row :”,event.row)
  24.         print(self.sheet.get_cell_data(event.row, event.column))
  25. class btns():
  26.     def __init__(self,frame) -> None:
  27.         self.frame = frame
  28.         self.btn1 = tk.Button(self.frame,text=”btn1″)
  29.         self.btn2 = tk.Button(self.frame,text=”btn2″)
  30.         self.btn3 = tk.Button(self.frame,text=”btn3″)
  31.         self.btn4 = tk.Button(self.frame,text=”btn4″)
  32.         self.btn1.pack()
  33.         self.btn2.pack()
  34.         self.btn3.pack()
  35.         self.btn4.pack()
  36. app = tk.Tk()
  37. frame1 = tk.Frame(app)
  38. frame2 = tk.Frame(app)
  39. sheet = sheetapp(frame = frame1)
  40. buttons = btns(frame=frame2)
  41. buttons.frame.pack(side=tk.LEFT)
  42. sheet.frame.pack(side=tk.RIGHT)
  43. buttons.btn1.config(command=sheet.set_value)
  44. buttons.btn2.config(command=sheet.get_values)
  45. app.mainloop()

 

btn1を押した後にセルを選択するとterminalに値が表示されます。B2を選択した場合の表示は下記の様になります。

  1. col : 1 row : 1
  2. b2

ダブルクリックしたcellの値の取得方法

イベントの種類を変えることでダブルクリック時=セルの編集状態時の値を取得することができます。

イベントはbegin_edit_cellを使いますが、この場合eventのメンバーにtextがあり、セルの値をeventから取得することができます。

 

  1. from tksheet import Sheet
  2. import tkinter as tk
  3. class sheetapp():
  4.     def __init__(self,frame) -> None:
  5.         self.frame = frame
  6.         self.sheet = Sheet(
  7.             self.frame,
  8.             )
  9.         self.sheet.enable_bindings()
  10.         self.sheet.extra_bindings(“begin_edit_cell”,func= self.get_cellvalue_double)
  11.         self.sheet.pack()
  12.     def set_value(self):
  13.         datalist = [
  14.             [“a1”,“b1”,“c1”],
  15.             [“a2”,“b2”,“c2”],
  16.             [“a3”,“b3”,“c3”],
  17.         ]
  18.         self.sheet.set_sheet_data(data = datalist)
  19.     def get_values(self):
  20.         data = self.sheet.get_sheet_data()
  21.         print(data)
  22.     def get_cellvalue_double(self, event):
  23.         print(“col :”,event.column,“row :”,event.row,“value :”, event.text)
  24. class btns():
  25.     def __init__(self,frame) -> None:
  26.         self.frame = frame
  27.         self.btn1 = tk.Button(self.frame,text=“btn1”)
  28.         self.btn2 = tk.Button(self.frame,text=“btn2”)
  29.         self.btn3 = tk.Button(self.frame,text=“btn3”)
  30.         self.btn4 = tk.Button(self.frame,text=“btn4”)
  31.         self.btn1.pack()
  32.         self.btn2.pack()
  33.         self.btn3.pack()
  34.         self.btn4.pack()
  35. app = tk.Tk()
  36. frame1 = tk.Frame(app)
  37. frame2 = tk.Frame(app)
  38. sheet = sheetapp(frame = frame1)
  39. buttons = btns(frame=frame2)
  40. buttons.frame.pack(side=tk.LEFT)
  41. sheet.frame.pack(side=tk.RIGHT)
  42. buttons.btn1.config(command=sheet.set_value)
  43. buttons.btn2.config(command=sheet.get_values)
  44. app.mainloop()

 

B2をダブルクリックした後の結果です。

  1. col : 1 row : 1 value : b2

セルの値を簡単に取得することができました。

こんな感じで色々な機能を紹介していこうと思います。