Tabキーを押して事前定義された数のスペースを挿入し、次にバックスペースを押してその数のスペースを変数に基づいて削除できるバインディングを作成したいと考えています。
ユーザーがバックスペースキーを押したときに、あらかじめ決められた数のスペースを削除するにはどうすればよいですか?複数の文字を削除する方法がわかりません。これを解決しようとすると、バインディングによって間違った数の文字が削除されます。
この質問には2つの部分があります。最初の部分は、一度に複数の文字を削除する方法に関連しています。2番目の部分は、バックスペースキーに関連付けられたバインディングでそれを使用する方法です
delete
テキストウィジェットのメソッドは2つのインデックスを取り、それらのインデックス間の文字を削除します。Tkinterテキストインデックスは、インデックスに修飾子を適用することで相対化できます。たとえば、挿入ポイントの前の4文字を参照するには、インデックス"insert"
と修飾子を使用できます"-4 chars"
。
例:
self.text.delete("insert -4 chars", "insert")
これらのインデックスは通常の文字列であるため、変数を使用する場合は文字列フォーマットを使用できます。
例:
tabWidth = 4
self.text.delete("insert -%d chars" % tabWidth, "insert")
ユーザーがバックスペースキーを押したときに関数を実行するには、関数を<BackSpace>
イベントにバインドします。この関数には、イベントを表す1つの引数が渡されます。
例えば:
self.text.bind("<BackSpace>", self.do_backspace)
...
def do_backspace(self, event):
...
標準キーへのカスタムバインディングを行う上で重要なことは、デフォルトではバインディングがデフォルトの動作に置き換わらないことを知っていることです。たとえば、バインディングが1文字を削除してから戻ると、バインディングによって1文字が削除され、デフォルトのバインディングによって1文字が削除されるため、2文字が削除されます。
この動作をオーバーライドする方法は、文字列を返すこと"break"
です。カスタムバインディングはデフォルトのバインディングの前に行われるため、デフォルトのバインディングでは「break」が返されたことがわかり、何もしません。これにより、デフォルトの動作をオーバーライドするか、デフォルトの動作を維持しながら追加の作業を行うことが非常に簡単になります。
すべてをまとめると、これは、前の4文字が4つの連続したスペースである場合は削除し、そうでない場合はデフォルトの動作を実行する関数を定義する方法です。
def do_backspace(self, event):
# get previous <tabWidth> characters; if they are all spaces, remove them
previous = self.text.get("insert -%d chars" % self.tabWidth, "insert")
if previous == " " * self.tabWidth:
self.text.delete("insert-%d chars" % self.tabWidth, "insert")
# return "break" so that the default behavior doesn't happen
return "break"
# if we get to here, we'll just return. That allows the default
# behavior to run
これは、Tabキーを押すと4つのスペースを挿入し、BackSpaceキーを押すと4つのスペースを削除する完全な実例です。
import tkinter as tk
def do_tab(event):
text.insert("insert", " " * tabWidth)
# return "break" so that the default behavior doesn't happen
return "break"
def do_backspace(event):
# get previous <tabWidth> characters; if they are all spaces, remove them
previous = text.get("insert -%d chars" % tabWidth, "insert")
if previous == " " * tabWidth:
text.delete("insert-%d chars" % tabWidth, "insert")
# return "break" so that the default behavior doesn't happen
return "break"
# if we get to here, we'll just return. That allows the default
# behavior to run
root = tk.Tk()
tabWidth = 4
text = tk.Text(root)
text.pack(fill="both", expand=True)
text.bind("<Tab>", do_tab)
text.bind("<BackSpace>", do_backspace)
root.mainloop()
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加