PR
tksheetは便利ですが、ドキュメントがちょっと手抜きなところがあります。
色々試行錯誤して漸く使い方がわかってきました。
今回はクリックしたセルの値の取得方法を紹介します。
セルのクリックイベントを使う
公式ドキュメントを見ますと下記の様に書かれています。
Bind various table functionality to your own functions. To unbind a function either set
func
argument toNone
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()を使って値を取得します。
- from tksheet import Sheet
- import tkinter as tk
- class sheetapp():
- def __init__(self,frame) -> None:
- self.frame = frame
- self.sheet = Sheet(
- self.frame,
- )
- self.sheet.enable_bindings()
- self.sheet.extra_bindings(“cell_select”,func= self.get_cellvalue)
- self.sheet.pack()
- def set_value(self):
- datalist = [
- [“a1″,”b1″,”c1”],
- [“a2″,”b2″,”c2”],
- [“a3″,”b3″,”c3”],
- ]
- self.sheet.set_sheet_data(data = datalist)
- def get_values(self):
- data = self.sheet.get_sheet_data()
- print(data)
- def get_cellvalue(self, event):
- print(“col :”,event.column,”row :”,event.row)
- print(self.sheet.get_cell_data(event.row, event.column))
- class btns():
- def __init__(self,frame) -> None:
- self.frame = frame
- self.btn1 = tk.Button(self.frame,text=”btn1″)
- self.btn2 = tk.Button(self.frame,text=”btn2″)
- self.btn3 = tk.Button(self.frame,text=”btn3″)
- self.btn4 = tk.Button(self.frame,text=”btn4″)
- self.btn1.pack()
- self.btn2.pack()
- self.btn3.pack()
- self.btn4.pack()
- app = tk.Tk()
- frame1 = tk.Frame(app)
- frame2 = tk.Frame(app)
- sheet = sheetapp(frame = frame1)
- buttons = btns(frame=frame2)
- buttons.frame.pack(side=tk.LEFT)
- sheet.frame.pack(side=tk.RIGHT)
- buttons.btn1.config(command=sheet.set_value)
- buttons.btn2.config(command=sheet.get_values)
- app.mainloop()
btn1を押した後にセルを選択するとterminalに値が表示されます。B2を選択した場合の表示は下記の様になります。
- col : 1 row : 1
- b2
ダブルクリックしたcellの値の取得方法
イベントの種類を変えることでダブルクリック時=セルの編集状態時の値を取得することができます。
イベントはbegin_edit_cellを使いますが、この場合eventのメンバーにtextがあり、セルの値をeventから取得することができます。
- from tksheet import Sheet
- import tkinter as tk
- class sheetapp():
- def __init__(self,frame) -> None:
- self.frame = frame
- self.sheet = Sheet(
- self.frame,
- )
- self.sheet.enable_bindings()
- self.sheet.extra_bindings(“begin_edit_cell”,func= self.get_cellvalue_double)
- self.sheet.pack()
- def set_value(self):
- datalist = [
- [“a1”,“b1”,“c1”],
- [“a2”,“b2”,“c2”],
- [“a3”,“b3”,“c3”],
- ]
- self.sheet.set_sheet_data(data = datalist)
- def get_values(self):
- data = self.sheet.get_sheet_data()
- print(data)
- def get_cellvalue_double(self, event):
- print(“col :”,event.column,“row :”,event.row,“value :”, event.text)
- class btns():
- def __init__(self,frame) -> None:
- self.frame = frame
- self.btn1 = tk.Button(self.frame,text=“btn1”)
- self.btn2 = tk.Button(self.frame,text=“btn2”)
- self.btn3 = tk.Button(self.frame,text=“btn3”)
- self.btn4 = tk.Button(self.frame,text=“btn4”)
- self.btn1.pack()
- self.btn2.pack()
- self.btn3.pack()
- self.btn4.pack()
- app = tk.Tk()
- frame1 = tk.Frame(app)
- frame2 = tk.Frame(app)
- sheet = sheetapp(frame = frame1)
- buttons = btns(frame=frame2)
- buttons.frame.pack(side=tk.LEFT)
- sheet.frame.pack(side=tk.RIGHT)
- buttons.btn1.config(command=sheet.set_value)
- buttons.btn2.config(command=sheet.get_values)
- app.mainloop()
B2をダブルクリックした後の結果です。
- col : 1 row : 1 value : b2
セルの値を簡単に取得することができました。
こんな感じで色々な機能を紹介していこうと思います。
PR