tkinterのバックスペースキーをバインドして複数の文字を削除するにはどうすればよいですか?

ブライアン・オークリー

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]

編集
0

コメントを追加

0

関連記事

分類Dev

複数のtmuxコマンドを1つのキーストロークにバインドするにはどうすればよいですか?

分類Dev

pdfjs:すべてのページを表示するために複数のキャンバスを作成するにはどうすればよいですか?

分類Dev

複数の要素をバインドして一緒にスクロールするにはどうすればよいですか?

分類Dev

Enterキーをtkinterの関数にバインドするにはどうすればよいですか?

分類Dev

Enterキーをtkinterの関数にバインドするにはどうすればよいですか?

分類Dev

Webサーバーの複数のサーバーアドレスをクライアントに保存するにはどうすればよいですか?

分類Dev

キーをバインドしてワークスペース間を循環するにはどうすればよいですか?

分類Dev

UITextFieldの外部キーボードから「コマンド+バックスペース」を検出するにはどうすればよいですか。

分類Dev

IndexedDBを使用している場合、キーではないインデックスを使用して複数のレコードを削除するにはどうすればよいですか?

分類Dev

キーイベントバインディングによってtkinterクラスの画像を更新するにはどうすればよいですか?

分類Dev

ウィンドウバッチの場合-ファイルから先頭のスペースを削除するにはどうすればよいですか?

分類Dev

WPFでバックスラッシュキーへのキーバインドを作成するにはどうすればよいですか?

分類Dev

sassで@forを使用して、バックグラウンドの位置を複数のクラスに割り当てるにはどうすればよいですか?

分類Dev

tmuxで `<prefix>スペース`のバインドを解除するにはどうすればよいですか?

分類Dev

バックスペースキーがonkeyupイベントをトリガーしないようにするにはどうすればよいですか?

分類Dev

どのtkinterキャンバスシェイプがクリックされているかを確認するにはどうすればよいですか?

分類Dev

自作キャスクを使用して最新バージョンのJavaJDKにアップグレードするにはどうすればよいですか?

分類Dev

同じコールバック関数を使用して複数の変数をトレースするにはどうすればよいですか?

分類Dev

最新のMongoDBC#ドライバーを使用して、複数の条件に基づいて複雑な配列オブジェクトのネストされた配列内の要素を削除するにはどうすればよいですか?

分類Dev

Googleスプレッドシートが複数を指している場合、コンテナにバインドされたスクリプトを削除するにはどうすればよいですか?

分類Dev

複数のオーディオデバイスをサラウンドとして使用するにはどうすればよいですか?

分類Dev

elasticsearch pythonで特定のフィールド名を使用して複数のインデックスからドキュメントを削除するにはどうすればよいですか?

分類Dev

SublimeText:「Home」キーをバインドしてカーソルを行の位置0(最初の非スペース文字ではない)に移動するにはどうすればよいですか?

分類Dev

javascriptクラスのコールバックでこれの正しい値をバインドするにはどうすればよいですか?

分類Dev

REST APIを使用してOpenTokセッションのサブスクライバーの数を取得するにはどうすればよいですか?

分類Dev

ページのスクロールバーを削除するにはどうすればよいですか?

分類Dev

NgxIndexedDBを使用してindexedDBインデックスから複数のレコードを取得するにはどうすればよいですか?

分類Dev

nodejsのmongodbドライバーを使用して複数のオプションのクエリを作成するにはどうすればよいですか?

分類Dev

スペースバーを.onkeypress(関数、スペースバー)にバインドするにはどうすればよいですか?

Related 関連記事

  1. 1

    複数のtmuxコマンドを1つのキーストロークにバインドするにはどうすればよいですか?

  2. 2

    pdfjs:すべてのページを表示するために複数のキャンバスを作成するにはどうすればよいですか?

  3. 3

    複数の要素をバインドして一緒にスクロールするにはどうすればよいですか?

  4. 4

    Enterキーをtkinterの関数にバインドするにはどうすればよいですか?

  5. 5

    Enterキーをtkinterの関数にバインドするにはどうすればよいですか?

  6. 6

    Webサーバーの複数のサーバーアドレスをクライアントに保存するにはどうすればよいですか?

  7. 7

    キーをバインドしてワークスペース間を循環するにはどうすればよいですか?

  8. 8

    UITextFieldの外部キーボードから「コマンド+バックスペース」を検出するにはどうすればよいですか。

  9. 9

    IndexedDBを使用している場合、キーではないインデックスを使用して複数のレコードを削除するにはどうすればよいですか?

  10. 10

    キーイベントバインディングによってtkinterクラスの画像を更新するにはどうすればよいですか?

  11. 11

    ウィンドウバッチの場合-ファイルから先頭のスペースを削除するにはどうすればよいですか?

  12. 12

    WPFでバックスラッシュキーへのキーバインドを作成するにはどうすればよいですか?

  13. 13

    sassで@forを使用して、バックグラウンドの位置を複数のクラスに割り当てるにはどうすればよいですか?

  14. 14

    tmuxで `<prefix>スペース`のバインドを解除するにはどうすればよいですか?

  15. 15

    バックスペースキーがonkeyupイベントをトリガーしないようにするにはどうすればよいですか?

  16. 16

    どのtkinterキャンバスシェイプがクリックされているかを確認するにはどうすればよいですか?

  17. 17

    自作キャスクを使用して最新バージョンのJavaJDKにアップグレードするにはどうすればよいですか?

  18. 18

    同じコールバック関数を使用して複数の変数をトレースするにはどうすればよいですか?

  19. 19

    最新のMongoDBC#ドライバーを使用して、複数の条件に基づいて複雑な配列オブジェクトのネストされた配列内の要素を削除するにはどうすればよいですか?

  20. 20

    Googleスプレッドシートが複数を指している場合、コンテナにバインドされたスクリプトを削除するにはどうすればよいですか?

  21. 21

    複数のオーディオデバイスをサラウンドとして使用するにはどうすればよいですか?

  22. 22

    elasticsearch pythonで特定のフィールド名を使用して複数のインデックスからドキュメントを削除するにはどうすればよいですか?

  23. 23

    SublimeText:「Home」キーをバインドしてカーソルを行の位置0(最初の非スペース文字ではない)に移動するにはどうすればよいですか?

  24. 24

    javascriptクラスのコールバックでこれの正しい値をバインドするにはどうすればよいですか?

  25. 25

    REST APIを使用してOpenTokセッションのサブスクライバーの数を取得するにはどうすればよいですか?

  26. 26

    ページのスクロールバーを削除するにはどうすればよいですか?

  27. 27

    NgxIndexedDBを使用してindexedDBインデックスから複数のレコードを取得するにはどうすればよいですか?

  28. 28

    nodejsのmongodbドライバーを使用して複数のオプションのクエリを作成するにはどうすればよいですか?

  29. 29

    スペースバーを.onkeypress(関数、スペースバー)にバインドするにはどうすればよいですか?

ホットタグ

アーカイブ