1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

tkinterのTextウィジェットを使っているときCtrl+Shift+Zでredoが効かないのを直す

Last updated at Posted at 2019-09-13

この記事では、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_widet.png

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()
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?