为什么tkinter的entry中的selection_clear()无效?

时间:2018-05-14 00:05:12

标签: python-3.x tkinter tkinter-entry

我想通过以下代码在Rightkey菜单中实现“剪切”:

self.entry_title = entry(frm, RIGHT, self.title, width = 58)
def menubarCut(self):
    if not self.entry_title.selection_present():
        showerror('***', 'No text selected')
    else:
        text = self.entry_title.selection_get()
        self.entry_title.selection_clear()
        self.clipboard_clear()
        self.clipboard_append(text)

然而,menubarCut返回“复制”而不是“剪切”的效果。也就是说,上面代码返回的结果与以下代码返回的结果相同:

self.entry_title = entry(frm, RIGHT, self.title, width = 58)
def menubarCopy(self):
    if not self.entry_title.selection_present():
        showerror('***', 'No text selected')
    else:
        text = self.entry_title.selection_get()
        self.clipboard_clear()
        self.clipboard_append(text)

似乎self.entry_title.selection_clear()没有效果。为什么会这样?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

根据@ BryanOakley对tkinter copy-pasting to Entry doesn't remove selected text的回答,我猜这就是你想要的:

def menubarCut(self):
    if self.entry_title.selection_present():
        text = self.entry_title.selection_get()
        self.entry_title.delete("sel.first", "sel.last")
        self.clipboard_clear()
        self.clipboard_append(text)
    else:
        showerror('***', 'No text selected')

selection_clear()方法清除选择行为(突出显示)而不是选择的实际文本。仅供参考,这是我为测试这个而创建的MCVE:

import sys
import tkinter as tk

class Application(tk.Frame):

    def __init__(self, master=None):
        super().__init__(master)

        self.entry_title = tk.Entry(master, width=50)
        self.entry_title.pack()

        self.entry_title.bind('<Escape>', self.event_handler)

    def menubarCut(self):
        if self.entry_title.selection_present():
            text = self.entry_title.selection_get()
            self.entry_title.delete("sel.first", "sel.last")
            self.clipboard_clear()
            self.clipboard_append(text)
        else:
            print('No text selected', file=sys.stdderr)

    def event_handler(self, event):
        self.menubarCut()

root = tk.Tk()
Application(root)
root.mainloop()