Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 文本不';t不包含任何标有“的字符”;sel";特金特_Python_Python 3.x_Tkinter - Fatal编程技术网

Python 文本不';t不包含任何标有“的字符”;sel";特金特

Python 文本不';t不包含任何标有“的字符”;sel";特金特,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我最近读到了受人尊敬的Bryan Oakley()所写的答案,他在其中展示了一个关于解决问题的示例代码 当我尝试使用该代码时&它一直正常工作,直到我复制或粘贴某个东西,即我按下Ctrl+C或Ctrl+V。关闭tkinter窗口时出现以下错误: \u tkinter.TclError:文本不包含任何标记为“sel”的字符 代码如下: import tkinter as tk class TextLineNumbers(tk.Canvas): def __init__(self, *arg

我最近读到了受人尊敬的Bryan Oakley()所写的答案,他在其中展示了一个关于解决问题的示例代码

当我尝试使用该代码时&它一直正常工作,直到我复制或粘贴某个东西,即我按下
Ctrl+C
Ctrl+V
。关闭tkinter窗口时出现以下错误:

\u tkinter.TclError:文本不包含任何标记为“sel”的字符

代码如下:

import tkinter as tk

class TextLineNumbers(tk.Canvas):
    def __init__(self, *args, **kwargs):
        tk.Canvas.__init__(self, *args, **kwargs)
        self.textwidget = None

    def attach(self, text_widget):
        self.textwidget = text_widget

    def redraw(self, *args):
        '''redraw line numbers'''
        self.delete("all")

        i = self.textwidget.index("@0,0")
        while True :
            dline= self.textwidget.dlineinfo(i)
            if dline is None: break
            y = dline[1]
            linenum = str(i).split(".")[0]
            self.create_text(2,y,anchor="nw", text=linenum)
            i = self.textwidget.index("%s+1line" % i)

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

class Example(tk.Frame):
    def __init__(self, *args, **kwargs):
        tk.Frame.__init__(self, *args, **kwargs)
        self.text = CustomText(self)
        self.vsb = tk.Scrollbar(orient="vertical", command=self.text.yview)
        self.text.configure(yscrollcommand=self.vsb.set)
        self.text.tag_configure("bigfont", font=("Helvetica", "24", "bold"))
        self.linenumbers = TextLineNumbers(self, width=30)
        self.linenumbers.attach(self.text)

        self.vsb.pack(side="right", fill="y")
        self.linenumbers.pack(side="left", fill="y")
        self.text.pack(side="right", fill="both", expand=True)

        self.text.bind("<<Change>>", self._on_change)
        self.text.bind("<Configure>", self._on_change)

        self.text.insert("end", "one\ntwo\nthree\n")
        self.text.insert("end", "four\n")
        self.text.insert("end", "five\n")

    def _on_change(self, event):
        self.linenumbers.redraw()

if __name__ == "__main__":
    root = tk.Tk()
    Example(root).pack(side="top", fill="both", expand=True)
    root.mainloop()
将tkinter作为tk导入
类文本行号(tk.Canvas):
定义初始化(self,*args,**kwargs):
画布。初始化(self,*args,**kwargs)
self.textwidget=None
def附加(自我、文本小部件):
self.textwidget=text\u小部件
def重绘(自身,*参数):
“重新绘制行号”
自我删除(“全部”)
i=self.textwidget.index(“@0,0”)
尽管如此:
dline=self.textwidget.dlineinfo(i)
如果数据线为无:中断
y=dline[1]
linenum=str(i).拆分(“.”[0]
self.create_文本(2,y,anchor=“nw”,text=linenum)
i=self.textwidget.index(“%s+1行”%i)
类CustomText(tk.Text):
定义初始化(self,*args,**kwargs):
tk.Text.\uuuu init\uuuuu(self,*args,**kwargs)
#为基础小部件创建代理
self._orig=self._w+“_orig”
self.tk.call(“重命名”,self.\w,self.\u orig)
self.tk.createcommand(self.\u w,self.\u代理)
def_代理(self,*args):
#让实际的小部件执行请求的操作
cmd=(自身源代码,)+args
结果=self.tk.call(cmd)
#如果添加或删除了某些内容,则生成事件,
#或者光标位置改变了
如果(插入、替换、删除中的参数[0]),或
参数[0:3]=(“标记”、“设置”、“插入”)或
args[0:2]==(“xview”、“moveto”)或
args[0:2]==(“xview”、“scroll”)或
args[0:2]==(“yview”、“moveto”)或
args[0:2]==(“yview”、“滚动”)
):
self.event_generate(“,when=“tail”)
#返回实际小部件返回的内容
返回结果
类示例(tk.Frame):
定义初始化(self,*args,**kwargs):
tk.Frame.\uuuu init\uuuuu(self,*args,**kwargs)
self.text=自定义文本(self)
self.vsb=tk.Scrollbar(orient=“vertical”,command=self.text.yview)
self.text.configure(yscrollcommand=self.vsb.set)
self.text.tag_configure(“bigfont”,font=(“Helvetica”,“24”,“bold”))
self.linenumbers=TextLineNumbers(self,宽度=30)
self.linenumber.attach(self.text)
自包装(side=“right”,fill=“y”)
self.linenumber.pack(side=“left”,fill=“y”)
self.text.pack(side=“right”,fill=“both”,expand=True)
self.text.bind(“,self.\u on\u change)
self.text.bind(“,self.\u on\u change)
self.text.insert(“结束”、“一个\n两个\n树”)
self.text.insert(“end”,“four\n”)
self.text.insert(“end”,“five\n”)
更改时的定义(自身、事件):
self.linenumber.redraw()
如果名称=“\uuuuu main\uuuuuuuu”:
root=tk.tk()
示例(root).pack(side=“top”,fill=“both”,expand=True)
root.mainloop()

问题在于,当您尝试复制或删除未选择的文本时,您会遇到错误。解决方案是增加一些额外的测试。将您的
\u proxy
函数替换为我的,以获得工作结果

def_代理(self、command、*args):
#复制时避免错误
如果命令=='get'和(参数[0]=='sel.first'和参数[1]=='sel.last'),而不是textArea.tag_范围('sel'):返回
#避免删除时出错
如果命令=='delete'和(args[0]=='sel.first'和args[1]=='sel.last'),而不是textArea.tag_范围('sel'):返回
cmd=(self.\u orig,command)+args
结果=self.tk.call(cmd)
如果命令位于('insert'、'delete'、'replace'):
自我事件_生成(“”)
返回结果
此处: