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

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

新規登録して質問してみよう
ただいま回答率
85.37%
Tkinter

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

27閲覧

python-tkinterのtksheetで入力文字を数字に限定する方法

akiteru

総合スコア20

Tkinter

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2024/11/21 08:27

実現したいこと

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"))にしてみたが変わらなかった

補足

特になし

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問