ブログ

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

image

2019年9月14日

tkinterのTextウィジェットでundoやredoを効かせる

この記事では、Windows10の環境で、Python 3.7.4を使っています。

Textウィジェットでのundoやredoのやり方ではまったので書かせてもらいたいと思う。

tkinterのTextウィジェットを表示させる

以下のコードでTextウィジェットを表示できる

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 = tk.Text()

text = tk.Text(undo=True)

と()にundo=Trueを入れるだけで良い。

これで、Ctrl+Zでundoができるようになる。のだが、なぜだかCtrl+Shift+Zでredoが効かない。これでは困ったことになるので、何とかしないといけない。

Textウィジェットでredoをさせる

方法として、bindを使う。

これは、あるイベントに対して、特定の処理を行うための方法である。

今回は、Ctrl+Shift+Zというイベントにredoを行う処理を与えることにする。これで上手くいくはずである。

まず、2行目にredoを行う処理を追加する。

def redo(event=None):
    text.edit_redo()

そして、6行目にbind設定を記入する。

text.bind('<Control-Shift-Key-Z>', redo)

このとき注意しないと行けないのはZは大文字にならないと行けない。(Shiftを押しているので大文字になるとのこと。)

これを実行するとちゃんとCtrl+Shift+Zでredoが効くようになる。

今回のすべてのソース

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