Work

tkinterでエクセル風のアプリ-tksheetの使い方-

pythonでデスクトップアプリを作ろうとするとどうしてもtkinterがよくつかわれますが、エクセル風に操作できるにするには結構手間がかかりますよね。

tkinterのテーマ付きウィジェットのttk.treeviewを使えばある程度エクセル風にはなりますが、どちらかと言うとリストボックスという感じでちょっと違いますね。
そんな時に役立つ外部ライブラリtksheetの紹介です。

tkesheetとは

tkesheetとはpythonで使える外部ライブラリです。tkinterのウィジェットとしてエクセルライクなテーブルを呼び出すことができます。

pyplにあるので他のライブラリと同様にpipを使ってダウンロードできます。環境によってpip3等を使う場合もあります。適宜修正して下さい。

pip install tksheet

tksheetを使ってみる

一応ドキュメントはありますが、ほかのtkinterのウィジェットと同じように使えますみたいな表現が多いです。なので実際に試しながら確認していきます。

公式ページにあるサンプルコードです。

  1. from tksheet import Sheet
  2. import tkinter as tk
  3. class demo(tk.Tk):
  4.     def __init__(self):
  5.         tk.Tk.__init__(self)
  6.         self.grid_columnconfigure(0, weight = 1)
  7.         self.grid_rowconfigure(0, weight = 1)
  8.         self.frame = tk.Frame(self)
  9.         self.frame.grid_columnconfigure(0, weight = 1)
  10.         self.frame.grid_rowconfigure(0, weight = 1)
  11.         self.sheet = Sheet(self.frame,
  12.                            data = [[f“Row {r}, Column {c}\nnewline1\nnewline2” for c in range(50)] for r in range(500)])
  13.         self.sheet.enable_bindings()
  14.         self.frame.grid(row = 0, column = 0, sticky = “nswe”)
  15.         self.sheet.grid(row = 0, column = 0, sticky = “nswe”)
  16. app = demo()
  17. app.mainloop()

実行してみるとほぼエクセルのシートが出てきたと思います。

行列の挿入や削除もできます。列名などもほぼエクセルです。

コードの説明

まずデータの入力方法ですが、sheet()の引数dataにリストで値を渡しています。

self.sheet = Sheet(self.frame,data = [[f”Row {r}, Column {c}\nnewline1\nnewline2″ for c in range(50)] for r in range(500)])

この例では内法表記ですので慣れてない方はわかりにくいかもしれませんが、forループを2重で回して50×500のセルにデータを入れています。

self.sheet.enable_bindings()

これで右クリックした場合の行列の挿入や削除の機能を追加しています。この辺りは細かく入れ替え可能ですので別の記事で紹介したいと思います。

使いやすいように部品class化

公式ドキュメントの例では汎用性に欠けるので、指定したフレーム内にsheetが入るように修正をしてみました。

  1. from tksheet import Sheet
  2. import tkinter as tk
  3. class sheetapp():
  4.     def __init__(self,frame1) -> None:
  5.         self.frame = frame1
  6.         self.sheet = Sheet(
  7.             self.frame,
  8.             data=[[f“Row {r}, Column {c}\nnewline1\nnewline2” for c in range(50)] for r in range(500)]
  9.             )
  10.         self.sheet.enable_bindings()
  11.         self.sheet.pack()
  12. app = tk.Tk()
  13. frame = tk.Frame(app)
  14. sheet = sheetapp(frame1 = frame)
  15. sheet.frame.pack()
  16. app.mainloop()

部品の配置では個人的に使いやすいと感じるpackに変更していますが、sheetappクラスに渡したframeはgridもできます。

以上

気になることがあれば追加で説明しますのでコメントをお願いします。また、お仕事の依頼なども受け付けておりますのでご相談ください。