如何在tkinter中绑定退格键删除多个字符?

2023-12-26

我想要创建绑定,让我可以根据变量按 Tab 键插入预定义数量的空格,然后按 Backspace 删除那么多空格。

当用户按下退格键时,如何删除预定数量的空格?我不知道如何删除多个字符,当我尝试解决此问题时,绑定删除了错误数量的字符。


这个问题有两个部分。第一部分涉及如何 一次删除多个字符。第二部分是如何在与退格键绑定的绑定中使用它

删除多个字符

The delete文本小部件的方法需要两个索引,并且将删除 这些索引之间的字符。 Tkinter 文本索引可以是相对的 通过对索引应用修饰符。例如,引用四个 插入点之前的字符可以使用索引"insert"加上修饰符"-4 chars".

Example:

self.text.delete("insert -4 chars", "insert")

由于这些索引是普通字符串,因此如果要使用变量,可以使用字符串格式。

Example:

tabWidth = 4
self.text.delete("insert -%d chars" % tabWidth, "insert")

使用带有绑定的函数

要在用户按下退格键时运行函数,您可以绑定 一个函数到<BackSpace>事件。该函数将被传递 代表事件的一个参数。

例如:

self.text.bind("<BackSpace>", self.do_backspace)
...
def do_backspace(self, event):
    ...

对标准键进行自定义绑定的一个重要部分是要知道默认情况下您的绑定将not替换默认行为。例如,如果您的绑定删除了一个字符然后返回,则将删除两个字符,因为您的绑定将删除一个字符,而默认绑定将删除一个字符。

覆盖此行为的方法是返回字符串"break"。因为您的自定义绑定发生在默认绑定之前,所以默认绑定将看到您返回“break”并且不执行任何操作。这使得覆盖默认行为或在保持默认行为的同时执行额外工作变得非常简单。

总而言之,您可以这样定义一个函数,如果前四个字符是四个连续空格,则删除它们,如果不是,则执行默认行为:

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

把它们放在一起

这是一个完整的工作示例,当您 按 T​​ab 键,然后按 Backspace 键删除四个空格:

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()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在tkinter中绑定退格键删除多个字符? 的相关文章

随机推荐

  • 如何在Python中遍历二维列表

    我有以下清单 grid 2 6 8 6 9 2 5 5 5 0 1 3 8 8 7 3 2 0 6 9 2 1 4 5 8 5 6 7 4 7 我使用 fowling 循环来遍历每个元素 gt for i in xrange len gri
  • GetSystemInfo 是否为您提供虚拟 CPU(即超线程)的总数?

    GetSystemInfo 将为您提供物理 CPU 核心的数量 但我想知道虚拟 CPU 的总数 IE 在新的 Nahelam 芯片上 它们有 4 个核心 但显示为 8 个 cpu 如果 GetSystemInfo 没有提供此信息 我需要什么
  • 如何使用 Storage Laravel 上传多个文件?

    现在我用一个简单的方法来上传图片 if request gt hasFile images file request gt file images Do uploading to Storage uploaded Storage put d
  • 如何在64位机器上不使用shell执行的情况下在C#中启动32位进程?

    我在 64 位计算机上有一个 ASP NET Web 应用程序 需要运行旧版 32 位报告应用程序 当我运行程序时UseShellExecute false 程序退出并退出代码 1073741502 我无法使用 Shell 执行 因为我必须
  • Keras 中具有多个输入/输出的 tf.data

    对于应用来说 比如配对文本相似度 输入数据类似于 pair 1 pair 2 在这些问题中 我们通常有多个输入数据 之前 我成功地实现了我的模型 model fit pair 1 pair 2 labels epochs 50 我决定用以下
  • 在 Qt 中扩展环境变量(getenv 等效)

    我正在寻找相当于getenv http www cplusplus com reference cstdlib getenv 功能 Qt 有一个包装器getenv 称为qgetenv http doc qt io qt 5 qtglobal
  • 如何将 key ctrl-left 绑定到 word-left?

    我使用 tcsh 和 emacs 在 emacs 中 我习惯使用 ctrl left 绑定键将我向左移动一个单词 我想在我的 tcsh 终端中做同样的事情 我可以按 ctrl b 但我只是不习惯 从bindkey manpath中我不清楚如
  • 标记和词位有什么区别?

    在 Aho Ullman 和 Sethi 的 Compiler Construction 一书中 给出了源程序的输入字符串被分成具有逻辑含义的字符序列 称为标记 而词位是组成标记的序列 所以什么是基本的区别吗 Using 编译器原理 技术和
  • or 运算符在这段 JavaScript 中起什么作用?

    因此 我浏览 JQuery 源代码以获取更好的编程技巧 并且发现了一些我不确定发生了什么的代码 type type callback 谁能解释一下 OR 是什么 变量赋值是做什么的 我做了一些实验 设置和取消设置值等等 但我一无所知 If
  • elasticsearch best_field 和most_field 有什么区别

    这篇文章我已经准备好了https www elastic co guide en elasticsearch reference current query dsl multi match query html https www elas
  • 如何使用 Sidekiq 运行连续后台作业?

    我一直在成功地使用 Sidekiq 来运行由 Rails 3 2 应用程序中的用户操作启动的后台作业 我的特定应用程序涉及通过第三方 API 从外部源发送和接收数据 我需要通过不断检查每个用户是否有数据可供下载来保持数据与此外部源同步 正如
  • 将一些代码从 C++ 转换为 C [重复]

    这个问题在这里已经有答案了 可能的重复 C 代码编译为 C 但不是 C https stackoverflow com questions 3143052 c code compiles as c but not as c Edit 我将库
  • 如何分割字符串同时忽略括号中的部分?

    我有一个字符串 我想使用逗号作为分隔符将其拆分为一个数组 我不希望括号之间的字符串部分被分割 即使它们包含逗号 例如 bibendum morbi non quam nec dui luctus rutrum nulla 应该变成 bibe
  • 使用javascript循环表并读取td内的值

    我有以下内容HTML我试图循环的表td s table thead tr th Product th th class currency Base Value th th class currency Unit Price th th cl
  • 这是 PostgreSQL SQL 引擎的错误吗?如何避免(解决方法)它?

    我正在解析文本文档并将它们插入到 PostgreSQL 数据库中 我的代码是用 Java 编写的 并且使用 JDBC 进行数据库连接 在将数据添加到数据库时 我遇到了非常奇怪的错误 似乎在不可预测的时刻 主循环的迭代次数不同 Postgre
  • Linux shell 脚本向文件名添加前导零

    我有一个包含大约 1 700 个文件的文件夹 他们的名字都像1 txt or 1497 txt等等 我想重命名所有文件 以便所有文件名都是四位数字长 I e 23 txt变成0023 txt 可以执行此操作的 shell 脚本是什么 或相关
  • doGet 方法在 tomcat 7 中运行的 servlet 中被调用两次,并使用 IntelliJ Idea 12 创建

    我创建了一个简单的 servlet 在 doGet 主体中只有一个 System out println 方法 但是当我使用 IntelliJ Idea 12 在 Tomcat 7 中运行它时 我收到一条消息 System out prin
  • 没有重复项或有序集的列表

    是否有一个库提供了一种数据结构 可以保留项目的顺序并且不包含任何重复项 这种数据结构是否存在合适的名称 我希望它的行为就像一个列表nub每次操作后应用 当然 我不希望它实施得那么无效 这是一种解决方案 Use a 手指树 http hack
  • ipywidgets.Textarea 中的等宽字体?

    我怎样才能让我的小部件使用等宽字体 from ipywidgets import Textarea Textarea The world is bigger than you 我想显示一些表格样式的数据 这也有效 from IPython
  • 如何在tkinter中绑定退格键删除多个字符?

    我想要创建绑定 让我可以根据变量按 Tab 键插入预定义数量的空格 然后按 Backspace 删除那么多空格 当用户按下退格键时 如何删除预定数量的空格 我不知道如何删除多个字符 当我尝试解决此问题时 绑定删除了错误数量的字符 这个问题有