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

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

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

Q&A

解決済

1回答

920閲覧

pythonのtksheetの使い方

akiteru

総合スコア21

0グッド

0クリップ

投稿2024/07/08 05:16

編集2024/07/08 05:26

実現したいこと

pythonのtksheetのextra_bindings("begin_move_rows")の使用方法

発生している問題・分からないこと

pythonのライブラリーtksheetのextra_bindingsで"begin_move_rows"を設定しましたが機能しません。
具体的には、下記コードを実行し表の中で行移動してもmessagebox.showerror("","begin_move_rows")のメッセージ表示がされません。他の関数はメッセージ表示が有ります。機能させる方法をご教授ください。又この機能は行移動前/行移動後のどちらで動作するのでしょうか?
尚、下記コードはhttps://github.com/ragardner/tksheet/wiki/Version-7#about-tksheetに記されたものに、"begin_move_rows"関連部分のみ書き加えたものです。

該当のソースコード

from tksheet import Sheet import tkinter as tk from tkinter import messagebox class demo(tk.Tk): def __init__(self): tk.Tk.__init__(self) self.grid_columnconfigure(0, weight=1) self.grid_rowconfigure(0, weight=1) self.frame = tk.Frame(self) self.frame.grid_columnconfigure(0, weight=1) self.frame.grid_rowconfigure(0, weight=1) self.sheet = Sheet(self.frame, data=[[f"Row {r}, Column {c}\nnewline1\nnewline2" for c in range(50)] for r in range(500)]) self.sheet.enable_bindings() # 下記の1行のみオリジナルに書き加えた self.sheet.extra_bindings("begin_move_rows", self.begin_move_rows) self.sheet.extra_bindings("begin_edit_cell", self.begin_edit_cell) self.sheet.edit_validation(self.validate_edits) self.sheet.popup_menu_add_command("Say Hello", self.new_right_click_button) self.frame.grid(row=0, column=0, sticky="nswe") self.sheet.grid(row=0, column=0, sticky="nswe") # オリジナルに加えたコード部 def begin_move_rows(self, event=None): messagebox.showerror("","begin_move_rows") def new_right_click_button(self, event=None): messagebox.showerror("","new_right_click_button") print ("Hello World!") def begin_edit_cell(self, event=None): messagebox.showerror("","begin_edit_cell") return event.value def validate_edits(self, event): # remove spaces from any cell edits, including paste messagebox.showerror("","begin_edit_cell") if isinstance(event.value, str) and event.value: return event.value.replace(" ", "") app = demo() app.mainloop()

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

コード行のself.sheet.extra_bindings("begin_move_rows", self.begin_move_rows)の"begin_move_rows"部分を"move_rows"に下記の様に変更しても実行されず、メッセージ表示はありません。変更後コード self.sheet.extra_bindings("move_rows", self.begin_move_rows)

補足

特になし

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

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

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

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

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

TakaiY

2024/07/08 11:28 編集

コードをそのままコピペしてこちらで実行し、行を選択して移動しようとすると、ちゃんとbegin_move_rowsのダイアログが表示されました。 質問のコードはどのように実行していますか? 行の移動はどのように実行しようとしていますか。 Python 3.10.11 tksheet-7.2.12
akiteru

2024/07/09 05:18

TakaiYさんコメントありがとうございます。 私の実行環境はpython 3.12.4、tksheet 7.2.12、エディターにvscodeを使用しこの中で「デバッグの実行」を行っています。 「行移動方法」フォーム画面表示後 (1)任意セルをマウス左クリックで選択⇒他のセルをマウス左クリックで選択 (2)任意セルをマウス左クリックで選択⇒PCの↓又は↑ボタンクリックで移動 この2種の移動操作で両者ともメッセージ表示無しです。 本日、再確認しましたが質問時と同状態で行移動のみメッセージ無しです。
TakaiY

2024/07/09 06:27 編集

そうでしたか。 でも、その操作は行の移動ではありませんね。 行の移動はその名の通り「行そのものの移動」で、行を選択(行番号のところと左クリック)して、その行番号をドラッグして移動する操作です。 これをやると行そのものが移動します。 試してみることはできますか。
akiteru

2024/07/09 07:03

TakaiYさんコメントありがとうございます。 確かに、ご指摘の操作をするとメッセージ表示が出ます。この様な操作が対象とは思いませんでした。 私の希望は、単純に表中の行を移動した場合にエベントを発生させたいと思っています。このトリガーとなる書式はどのようなものでしょうか?tksheetにての知見が有ればご教授ください。 tksheetはネットでの情報が少なく初心者で苦労しています。他にエクセル風な操作が可能なモジュールが有れば紹介ください。
guest

回答1

0

ベストアンサー

tksheet使ったことありませんが、書いてみます。

私の希望は、単純に表中の行を移動した場合にエベントを発生させたいと思っています。このトリガーとなる書式はどのようなものでしょうか?tksheetにての知見が有ればご教授ください。

この「行を移動」というのがどのような操作の検出を意味しているのか不明ですが、

(1)任意セルをマウス左クリックで選択⇒他のセルをマウス左クリックで選択
(2)任意セルをマウス左クリックで選択⇒PCの↓又は↑ボタンクリックで移動

ということだと、セルのフォーカスの変更をつかまえればよさそうです。
また、「ネットでの情報が少なく」とありますが、それなりにちゃんとしたドキュメントがありますので、これだけどもある程度。

それから、GUIの操作の用語の知識も必要と思います。 今回の操作も「移動」としていますが、通常このような操作は移動とは表現せず、「選択の変更」または単に「選択」となります。なので、この場合「move」を探すのではなく「select」とか「selection」などをキーにして探すとみつかります。

ドキュメントで、extra_bindingsでつかまえられるイベントの一覧からそうやって探してみると、"cell_select" で始まる一連のイベントがあります。
https://github.com/ragardner/tksheet/wiki/Version-7#bind-specific-table-functionality

また、呼び出されるコールバック関数に渡されるパラメータには、様々の情報が入っているようなので、それらの情報から目的である「選択したセルの行が変更されたか」を検知できるかもしれません。

たとえば、以下のようなコードを追加して、

python

1 self.sheet.extra_bindings("cell_select", self.check_event) 2 3 def check_event(self, event=None): 4 print(f'selected: {event.selected}')

セル (4, 2)を選択すると、以下のような情報が出力されます。

text

1selected: Selected(row=4, column=2, type_='cells', box=Box_nt(from_r=4, from_c=2, upto_r=5, upto_c=3), iid=48, fill_iid=47)

これだけでは「移動したか」はわかりませんが、前の情報を取っておいてそれと比較すればわかりますね。

もっといい方法もあるかもしれません。 いろいろなイベントを確認してみるといいでしょう。

tksheeht

投稿2024/07/09 08:35

TakaiY

総合スコア14261

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

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

akiteru

2024/07/10 03:48

回答ありがとうございます。 ベストアンサーに選ばせていただきました。 "move_rows"が「行を動く」ではなく「行を動かす」と読むこと、"select"参考になりました。 先が見えてきた感じです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問