tkinter 复制粘贴到条目不会删除选定的文本

2024-03-14

当我复制一些文本并将其粘贴(ctrl + v)到 tkinter Entry 中时,如果有选定的文本,它不会将其从条目中删除。我使用的是 Linux (Mint) 64 位。

Here I copy "d" with (ctrl + c): enter image description here

Then I select "b": enter image description here

Now I paste "d" (ctrl + v) onto it but the result is this: enter image description here

First:我想知道这是 Linux 特有的错误还是本来就是这样的?

Second:我正在考虑解决这个问题的方法validatecommand但我遇到了另一个问题:

如果我要删除命令中选定的文本,我必须知道条目中选择的索引。否则,如果在光标之后和之前有多个选定文本的实例,我将不知道要删除哪一个并用新文本替换。因为光标可能位于所选内容的任一侧(取决于用户是否在文本上从右到左或从左到右拖动鼠标)。

现在有没有办法获得index of 选择在条目中?或者另一种方法来解决这个问题?

这是一些带有问题示例的代码:

import tkinter as tk

root = tk.Tk()

def validation(after_text, before_text, validation_text, cursor_index):
    cursor_index = int(cursor_index)
    print('cursor index:', cursor_index)
    print('text after change:', after_text)
    print('text before change:', before_text)
    print('text in need of validation:', validation_text)

    try:
        selection = root.selection_get()
    except:
        selection = ''
    print('selection:', selection)

    # EXAMPLE:

    # validation_text = 'd'
    # before text = "bb"

    # now if someone dragged from right to left on the 2nd b:
    # cursor position will be 1 (imagine | as the cursor): 'b|b' 
    # cursor_index = 1
    # after_text = 'bdb' --> but should be 'bd'

    # now if someone dragged from left to right on the 2nd b:
    # cursor position will be 2 (imagine | as the cursor): 'bb|' 
    # cursor_index = 2
    # after_text = 'bbd' --> but should be 'bd'

    # so there is no way for me to know which of these b's I have
    # to replace with d based on cursor position alone. I have to
    # know the index of selection itself in before_text to be
    # able to replace the text properly.

    # I don't know how to get that.

    return True

txtvar = tk.StringVar(value = 'a-b-c-d-e')
entry = tk.Entry(root, textvariable = txtvar)
font = tk.font.Font(family = entry.cget('font'), size = -50)

entry.config(validate = 'all',
    vcmd = (root.register(validation),'%P', '%s', '%S', '%i'),
    font = font)
entry.pack()

root.mainloop()

这不是一个错误。如果它是一个错误,十年前就会有人注意到它并修复它。 Tkinter 已经存在很长时间了,像这样的基本事情不会被忽视。

在基于 X11 的系统上执行粘贴不会在粘贴之前删除所选文本。以下是我撰写本文时实际的底层 Tcl 代码:

bind Entry <<Paste>> {
    global tcl_platform
    catch {
        if {[tk windowingsystem] ne "x11"} {
            catch {
                %W delete sel.first sel.last
            }
        }
        %W insert insert [::tk::GetSelection %W CLIPBOARD]
        tk::EntrySeeInsert %W
    }
}

使用验证功能绝对是解决这个问题的错误方法。顾名思义,验证是专门针对的:验证。正确的解决方案是创建您自己的绑定<<Paste>> event.

现在有没有办法获取条目中选择的索引?或者另一种方法来解决这个问题?

是的,条目小部件有特殊索引sel.first它代表选择中的第一个字符,并且sel.last代表刚刚选择后的字符。

将上述代码直接翻译成 python(减去 x11 的检查)将如下所示:

def custom_paste(event):
    try:
        event.widget.delete("sel.first", "sel.last")
    except:
        pass
    event.widget.insert("insert", event.widget.clipboard_get())
    return "break"

要将此应用到特定小部件,请绑定到<<Paste>>该小部件的事件:

entry = tk.Entry(...)
entry.bind("<<Paste>>", custom_paste)

如果您想做一个适用于每个Entry小部件,使用bind_class:

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

tkinter 复制粘贴到条目不会删除选定的文本 的相关文章

随机推荐

  • 如何更改 Qthread 内 Qtimer 的时间间隔?

    我希望能够更改 QThread 内 QTimer 的间隔时间 这是我的代码 import sys from PyQt5 import QtWidgets from PyQt5 QtWidgets import QApplication QM
  • 计算 pow(a,b) mod n

    I want to calculate ab mod n for use in RSA decryption My code below returns incorrect answers What is wrong with it uns
  • 在 PHP openssl 中加密并在 javascript CryptoJS 中解密

    我正在使用 PHP 加密一些参数 openssl parameter AES 256 ECB client 我想解密CryptoJS CryptoJS AES decrypt parameter client mode CryptoJS m
  • 用图像设计按钮?

    我一直在尝试使用图像来设计提交按钮的样式 我会使用 CSS 但按钮的设计太复杂了 我尝试向按钮添加背景图像 但该图像的位置不正确 我也尝试过使用
  • wxPython 是否有原生的 FlowLayoutManager/FlowSizer/WrapSizer 实现?

    我正在尝试在wxPython 2 8 使用Python 2 7 中编写一个GUI 其中涉及在sizer中布置几个wx StaticTexts 我想要的是一个大小调整器 如果它检测到当前行的宽度比窗口的宽度宽 它会自动将任何附加元素添加到新行
  • 通过一组唯一的列值过滤 SQL 查询,无论其顺序如何

    我在 Oracle 中有一个表 其中包含两列 我想在其中查询包含唯一值组合的记录 而不管这些值的顺序如何 例如 如果我有下表 create table RELATIONSHIPS PERSON 1 number not null PERSO
  • 您可以使用 Python 正则表达式从偏移量开始向后搜索吗?

    给定一个字符串以及该字符串中的字符偏移量 我可以使用 Python 正则表达式向后搜索吗 我试图解决的实际问题是在字符串中的特定偏移量处获取匹配短语 但我必须匹配该偏移量之前的第一个实例 在我的正则表达式只有一个符号长 例如 单词边界 的情
  • Android 抛出 IndexOutOfBound 异常

    我制作了一个Android应用程序 因为数据来自服务器 所以这是一个耗时的过程 所以我创建了一个进度对话框 下面是我的代码 Override protected void onResume super onResume if placesL
  • JQuery UI 删除类动画似乎不起作用

    我正在使用一系列 CSS3 转换 但对于较旧的机器 通过使用 JQuery UI 添加和删除类进行备份 JQuery UI addClass 动画功能齐全 然而 JQuery UI removeClass 并没有设置动画 而是延迟动画时间
  • 读取 SML 中的命令行参数

    我正在尝试读取输入文件的名称 argv 1 这是我到目前为止所做的 val args CommandLine arguments val x y args val agora x 但我不断收到此错误消息 uncaught exception
  • Magento - 从选项值 ID 获取自定义选项值详细信息

    我有一些与产品自定义选项相关的有趣问题 选项和自定义选项之间有什么区别吗 这是因为我在几乎所有与产品相关的模块中为每个产品详细信息找到了两个不同的属性 options custom options 然而 只有一个类只适用于产品选项 它倾向于
  • Respond.JS 在 IE 8 中不工作

    由于某种原因 响应 JS 似乎不起作用 我正在使用 IE 8 中的媒体查询来更改各种尺寸显示器的背景图像 在 IE 8 中没有背景 只有纯色 代码如下所示 媒体查询如下所示 media min width 769px and max wid
  • 如何向 JButton 添加行数未知的多行文本? (动态)[重复]

    这个问题在这里已经有答案了 如何在a上制作文字JButton多行 我读到大多数人都使用 HTML 但是当它是动态的并且您不知道行的大 小或行是什么时会发生什么 现在我按钮上的文本以 而不是创建一条新线 大多数其他方法假设您知道该字符串并且是
  • 线程通过 sysfs 调用内核信号量时出现死锁

    源自这个问题 https stackoverflow com q 17391276 912144 and 我的解决方案 https stackoverflow com a 17443774 912144 我开始意识到可能存在僵局 但我不明白
  • 如何在 ASP.NET Core 应用程序中显示和更新自定义身份字段?

    我使用创建了一个 ASP NET Core 应用程序core 3 1我已经包含了开箱即用的身份验证 我想添加一些自定义字段供我的用户完成 例如Location and Instagram 继此处说明 https learn microsof
  • Cocoa 自定义通知示例

    有人可以向我展示一个带有自定义通知的 Cocoa Obj C 对象的示例吗 如何触发它 订阅它并处理它 implementation MyObject Posts a MyNotification message whenever call
  • objectForKey 和 valueForKey 之间的区别?

    有什么区别objectForKey and valueForKey 我在文档中查找了它们 它们对我来说似乎是一样的 objectForKey is an NSDictionary方法 一个NSDictionary是一个类似于集合类NSArr
  • 在 Next.js 中,如何创建“模态链接”(即更改 URL 并添加组件但不重新渲染整个页面的链接)

    当一个站点有一个对话框时 它通常纯粹用 JS 完成 不涉及 页面 即路由 但是 有时您希望对话框有自己的 URL 以便在用户刷新页面时 他们会返回到对话框打开的页面 在 Next js 中 我已经完成了上述大部分工作 我有一个基本页面路由
  • Xcode 找不到 C++ 静态库

    所以我之前遇到过一些问题 但我删除了我的旧问题并将其更新为这个问题 事情是这样的 我想在我的 iOS Swift 项目中使用 C 库 在这个社区的帮助下 我将我的库编译为静态库 a 文件 现在我创建了一个新项目来测试这一点 我只执行了以下步
  • tkinter 复制粘贴到条目不会删除选定的文本

    当我复制一些文本并将其粘贴 ctrl v 到 tkinter Entry 中时 如果有选定的文本 它不会将其从条目中删除 我使用的是 Linux Mint 64 位 Here I copy d with ctrl c Then I sele