当我尝试在自定义tkinter文本字段中剪切和粘贴时出现_tkinter.TclError

时间:2018-11-21 17:32:10

标签: python-3.x tkinter

我正在使用在python 3中使用tkinter的文本编辑器。我在使用自定义文本字段类来获取行号时遇到问题。这是从Brian Oakley到this question的答案中得出的。这是该类的代码:

ViewEncapsulation

这是剪切功能的代码:

int customRound(int i)
        {
            return (int)(Math.Ceiling(i / Math.Pow(10, i.ToString().Length-1)) * Math.Pow(10, i.ToString().Length - 1));
        }

这是粘贴功能的代码:

class CustomText(tk.Text):
    def __init__(self, *args, **kwargs):
        tk.Text.__init__(self, *args, **kwargs)

        # create a proxy for the underlying widget
        self._orig = self._w + "_orig"
        self.tk.call("rename", self._w, self._orig)
        self.tk.createcommand(self._w, self._proxy)

    def _proxy(self, *args):
        # let the actual widget perform the requested action
        cmd = (self._orig,) + args
        result = self.tk.call(cmd)

        # generate an event if something was added or deleted,
        # or the cursor position changed
        if (args[0] in ("insert", "replace", "delete") or 
            args[0:3] == ("mark", "set", "insert") or
            args[0:2] == ("xview", "moveto") or
            args[0:2] == ("xview", "scroll") or
            args[0:2] == ("yview", "moveto") or
            args[0:2] == ("yview", "scroll")
        ):
            self.event_generate("<<Change>>", when = "tail")

        # return what the actual widget returned
        return result

这是错误回溯(路径中的凭据除外):

def cutSelected(event=None):
    textField.event_generate("<<Cut>>")

...

# Add cut to the edit menu in the menu bar
editMenu.add_command(label = "Cut", command = cutSelected, accelerator = "Ctrl+X")

...

# setting up the keyboard shortcut for the cut function
textField.bind("<Control-x>", cutSelected)
textField.bind("<Control-X>", cutSelected)

当我尝试通过键盘快捷键粘贴文本时,没有出现错误,它只是在同一行上粘贴了两次文本。 (例如:def paste(event=None): textField.event_generate("<<Paste>>") ... # Add paste to the edit menu in the menu bar editMenu.add_command(label = "Paste", command = paste, accelerator = "Ctrl+V") ... # setting up the keyboard shortcut for the paste function textField.bind("<Control-v>", paste) textField.bind("<Control-V>", paste) 被粘贴为Traceback (most recent call last): File "C:\Users\me\mydocuments\Programming\myeditor\main.py", line 457, in <module> root.mainloop() File "C:\Users\me\AppData\Local\Programs\Python\Python37- 32\lib\tkinter\__init__.py", line 1283, in mainloop self.tk.mainloop(n) File "C:\Users\me\mydocuments\Programming\myeditor\main.py", line 58, in _proxy result = self.tk.call(cmd) _tkinter.TclError: text doesn't contain any characters tagged with "sel" ),但是当我通过菜单栏中的编辑菜单执行操作时,出现了上面显示的错误。

从编辑菜单执行剪切时效果很好,但是当我尝试通过键盘快捷键剪切文本时,出现错误。

我将近一周以来一直在尝试解决这些问题,而我得到的最接近答案是来自this question的堆栈溢出。我尝试了该代码,并遇到了完全相同的问题。我不确定还有什么办法,所以对您的任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

  

_tkinter.TclError:文本不包含任何标有“ sel”的字符

我认为我没有适当的解决方法,但是我有一些措施可以防止您的代码崩溃。

替换此:

result = self.tk.call(cmd)

...与此:

try:
    result = self.tk.call(cmd)
except Exception:
    return None

它可能掩盖了其他应该合理地引发错误的内容,但目前这是我拥有的最佳解决方案。

  

当我尝试通过键盘快捷键粘贴文本时,它并没有给我错误,它只是在同一行上粘贴了两次文本。

它可能已经执行了两次,因为tkinter已经具有用于剪切和粘贴的默认绑定。可能发生的情况是您的绑定正在触发,然后内置绑定正在触发。如果要阻止内置绑定生效,则需要从"break"返回paste。我只是在此猜测,因为您没有为此提供[mcve]。