この記事では、Windows10の環境で、Python 3.7.4を使っています。
tkinterのTextウィジェットでundoやredoを効かせる
Textウィジェットでのundoやredoのやり方ではまったので書かせてもらいたいと思う。
tkinterのTextウィジェットを表示させる
以下のコードでTextウィジェットを表示できる
text.py
import tkinter as tk
root = tk.Tk()
text = tk.Text()
text.grid(column=0, row=0, sticky=(tk.N, tk.S, tk.E, tk.W))
root.mainloop()
Textウィジェットでundo redoをさせる
undo redoをさせるにはそんなに難しくない。4行目の
text.py
text = tk.Text()
を
text.py
text = tk.Text(undo=True)
と()にundo=Trueを入れるだけで良い。
これで、Ctrl+Zでundoができるようになる。のだが、なぜだかCtrl+Shift+Zでredoが効かない。これでは困ったことになるので、何とかしないといけない。
Textウィジェットでredoをさせる
方法として、bindを使う。
これは、あるイベントに対して、特定の処理を行うための方法である。
今回は、Ctrl+Shift+Zというイベントにredoを行う処理を与えることにする。これで上手くいくはずである。
まず、2行目にredoを行う処理を追加する。
text.py
def redo(event=None):
text.edit_redo()
そして、6行目にbind設定を記入する。
text.py
text.bind('<Control-Shift-Key-Z>', redo)
このとき注意しないと行けないのはZは大文字にならないと行けない。(Shiftを押しているので大文字になるとのこと。)
これを実行するとちゃんとCtrl+Shift+Zでredoが効くようになる。
今回のすべてのソース
text.py
import tkinter as tk
def redo(event=None):
text.edit_redo()
root = tk.Tk()
text = tk.Text(undo=True)
text.grid(column=0, row=0, sticky=(tk.N, tk.S, tk.E, tk.W))
text.bind('<Control-Shift-Key-Z>', redo)
root.mainloop()