我正在使用在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的堆栈溢出。我尝试了该代码,并遇到了完全相同的问题。我不确定还有什么办法,所以对您的任何帮助都将不胜感激。
答案 0 :(得分:0)
_tkinter.TclError:文本不包含任何标有“ sel”的字符
我认为我没有适当的解决方法,但是我有一些措施可以防止您的代码崩溃。
替换此:
result = self.tk.call(cmd)
...与此:
try:
result = self.tk.call(cmd)
except Exception:
return None
它可能掩盖了其他应该合理地引发错误的内容,但目前这是我拥有的最佳解决方案。
当我尝试通过键盘快捷键粘贴文本时,它并没有给我错误,它只是在同一行上粘贴了两次文本。
它可能已经执行了两次,因为tkinter已经具有用于剪切和粘贴的默认绑定。可能发生的情况是您的绑定正在触发,然后内置绑定正在触发。如果要阻止内置绑定生效,则需要从"break"
返回paste
。我只是在此猜测,因为您没有为此提供[mcve]。