背景
tkinter で undo, redo やりたい.
Text
widget だと undo=True
でいけたりするが, たとえば Entry
widget では対応していない.
また, カスタム widget 作った場合も同様で自前で undo/redo の仕組みを作る必要がある.
方法
ウィジェト全体にキーバインドをしかけて, 自前で undo/redo 処理が必要でした.
ctrl-z
で undo したい場合, <Control-z>
を bind に指定します.
undo/redo の情報の保存
幸い Python は値を保存するというのがやりやすいので, 適当に編集履歴の情報を stack(list) に追加したりしていけばいいでしょう.
(C++ とかだとめんどい. std::any
や, JSON とかにメッセージをシリアライズとかしないといけない)
GUI 要素が動的に追加/削除されるのではなければ, event
あたりにあるウィジェトの id(ハンドル?)あたりを保存でもいいかもしれません.
ctrl-shift-z
で redo したい.
tkinterのTextウィジェットを使っているときCtrl+Shift+Zでredoが効かないのを直す
https://qiita.com/Dr_Thomas/items/c825e4bf21e150f6188c
ありがとうございます. shift
キーを含める場合は, この場合は Key-Z
と Z 大文字が必要でした.