実現したいこと
python-tkinterのtksheetモジュールを使い、エクセル風のデータ入出力をしたい。セルの入力可能文字種は小文字数字のみ限定。セルをシングルクリックで選択時は既存データに入力値を追加及びdeleteとbackspaceキーは有効とし何れでも既存データを削除。ダブルクリックで選択時は既存データ末端にカーソル表示。左右矢印キーで移動しカーソル位置に入力数字入力及びdeleteとbackspaceキーは有効としカーソル前後文字を削除。表示文字列の先頭又は末尾で左右矢印キーが押された場合はそれぞれの方向の次のセルに移動(左端又は右端でのさらなる移動は実行しない)。全工程で上下矢印を有効とし、選択セルを上下移動させる。この様な表形式を実現したい
発生している問題・分からないこと
シングルクリックでセル選択時は数字限定が出来ました。
(1)ダブルクリックでセル選択すると数字限定が出来ません。
(2)左右矢印キーで既存表示のデータの先端又は末端で再入力時は隣のセルに移動方法が判りません
該当のソースコード
# xxx.py import tkinter as tk from tkinter import ttk from tksheet import Sheet class SampleApp: def __init__(self, root): self.root = root self.root.title("編集サンプル") # スタイル設定 self.style = ttk.Style() self.style.theme_use('alt') # 初回入力時にセル内容をクリアするフラグ self.clear_on_first_input = True # tksheetのセットアップ self.sheet = Sheet(root, data=[[f"データ {i}-{j}" for j in range(5)] for i in range(5)], headers=["A", "B", "C", "D", "E"]) self.sheet.enable_bindings(("single_select", "arrowkeys", "edit_cell")) # tksheetを配置 self.sheet.grid(row=0, column=0, columnspan=2) # キー入力時のイベントバインド self.sheet.bind("<KeyPress>", self.on_key_press) def on_key_press(self, event): """キー入力時の処理""" # 現在のセルの位置を取得 selected_cells = list(self.sheet.get_selected_cells()) if not selected_cells: return row, col = selected_cells[0] # 現在のセル内容を取得 current_value = self.sheet.get_cell_data(row, col) if event.keysym in ("BackSpace", "Delete"): # BackspaceキーとDeleteキーの処理 new_value = current_value[:-1] if event.keysym == "BackSpace" else "" self.sheet.set_cell_data(row, col, new_value) elif event.keysym in ("Left", "Right"): # 左右矢印キーの処理 if event.keysym == "Left" and col > 0: self.sheet.select_cell(row, col - 1) elif event.keysym == "Right" and col < self.sheet.total_columns - 1: self.sheet.select_cell(row, col + 1) elif event.keysym in ("Up", "Down"): # 上下矢印キーの処理 if event.keysym == "Up" and row > 0: self.sheet.select_cell(row - 1, col) elif event.keysym == "Down" and row < self.sheet.total_rows - 1: self.sheet.select_cell(row + 1, col) elif event.char.isdigit(): # 数字キーのみ許可 new_value = (current_value or "") + event.char self.sheet.set_cell_data(row, col, new_value) else: # その他のキーは無視 pass if __name__ == "__main__": root = tk.Tk() app = SampleApp(root) root.mainloop()
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
self.sheet.enable_bindings(("single_select", "arrowkeys", "edit_cell"))を
self.sheet.enable_bindings(("all"))にしてみたが変わらなかった
補足
特になし
あなたの回答
tips
プレビュー