Python 如何从Tkinter画布文本项中删除icursor?

Python 如何从Tkinter画布文本项中删除icursor?,python,tkinter,tk,tkinter-canvas,Python,Tkinter,Tk,Tkinter Canvas,下面是Effbot的Tkinter页面: 我遇到的麻烦是,在插入icursor后,我似乎无法让它消失 如何完全停止编辑 例如,链接页面中的一个将起作用: # File: canvas-editing-example-1.py # # editing canvas items # # fredrik lundh, december 1998 # # fredrik@pythonware.com # http://www.pythonware.com # from tkinter import

下面是Effbot的Tkinter页面:

我遇到的麻烦是,在插入icursor后,我似乎无法让它消失

如何完全停止编辑

例如,链接页面中的一个将起作用:

# File: canvas-editing-example-1.py
#
# editing canvas items
#
# fredrik lundh, december 1998
#
# fredrik@pythonware.com
# http://www.pythonware.com
#

from tkinter import *
#Change to Tkinter to use python 2.x series
class MyCanvas(Frame):

    def __init__(self, root):
        Frame.__init__(self, root)

        self.canvas = Canvas(self)
        self.canvas.pack(fill=BOTH, expand=1)

        # standard bindings
        self.canvas.bind("<Double-Button-1>", self.set_focus)
        self.canvas.bind("<Button-1>", self.set_cursor)
        self.canvas.bind("<Key>", self.handle_key)

        # add a few items to the canvas
        self.canvas.create_text(50, 50, text="hello")
        self.canvas.create_text(50, 100, text="world")

    def highlight(self, item):
        # mark focused item.  note that this code recreates the
        # rectangle for each update, but that's fast enough for
        # this case.
        bbox = self.canvas.bbox(item)
        self.canvas.delete("highlight")
        if bbox:
            i = self.canvas.create_rectangle(
                bbox, fill="white",
                tag="highlight"
                )
            self.canvas.lower(i, item)

    def has_focus(self):
        return self.canvas.focus()

    def has_selection(self):
        # hack to work around bug in Tkinter 1.101 (Python 1.5.1)
        return self.canvas.tk.call(self.canvas._w, 'select', 'item')

    def set_focus(self, event):
        if self.canvas.type(CURRENT) != "text":
            return

        self.highlight(CURRENT)

        # move focus to item
        self.canvas.focus_set() # move focus to canvas
        self.canvas.focus(CURRENT) # set focus to text item
        self.canvas.select_from(CURRENT, 0)
        self.canvas.select_to(CURRENT, END)

    def set_cursor(self, event):
        # move insertion cursor
        item = self.has_focus()
        if not item:
            return # or do something else

        # translate to the canvas coordinate system
        x = self.canvas.canvasx(event.x)
        y = self.canvas.canvasy(event.y)

        self.canvas.icursor(item, "@%d,%d" % (x, y))
        self.canvas.select_clear()

    def handle_key(self, event):
        # widget-wide key dispatcher
        item = self.has_focus()
        if not item:
            return

        insert = self.canvas.index(item, INSERT)

        if event.char >= " ":
            # printable character
            if self.has_selection():
                self.canvas.dchars(item, SEL_FIRST, SEL_LAST)
                self.canvas.select_clear()
            self.canvas.insert(item, "insert", event.char)
            self.highlight(item)

        elif event.keysym == "BackSpace":
            if self.has_selection():
                self.canvas.dchars(item, SEL_FIRST, SEL_LAST)
                self.canvas.select_clear()
            else:
                if insert > 0:
                    self.canvas.dchars(item, insert-1, insert)
            self.highlight(item)

        # navigation
        elif event.keysym == "Home":
            self.canvas.icursor(item, 0)
            self.canvas.select_clear()
        elif event.keysym == "End":
            self.canvas.icursor(item, END)
            self.canvas.select_clear()
        elif event.keysym == "Right":
            self.canvas.icursor(item, insert+1)
            self.canvas.select_clear()
        elif event.keysym == "Left":
            self.canvas.icursor(item, insert-1)
            self.canvas.select_clear()

        else:
            pass # print event.keysym

# try it out (double-click on a text to enable editing)
c = MyCanvas(Tk())
c.pack()

mainloop()
#文件:canvas-editing-example-1.py
#
#编辑画布项目
#
#fredrik lundh,1998年12月
#
# fredrik@pythonware.com
# http://www.pythonware.com
#
从tkinter进口*
#更改为Tkinter以使用Python2.x系列
类MyCanvas(框架):
定义初始化(自,根):
帧.\uuuu init\uuuuu(self,root)
self.canvas=画布(self)
self.canvas.pack(fill=BOTH,expand=1)
#标准绑定
self.canvas.bind(“,self.set\u focus)
self.canvas.bind(“,self.set\u游标)
self.canvas.bind(“,self.handle\u键)
#在画布上添加一些项目
self.canvas.create_text(50,50,text=“hello”)
self.canvas.create_text(50100,text=“world”)
def突出显示(自身,项目):
#标记重点项目。请注意,此代码重新创建
#矩形用于每次更新,但这对于
#这个案子。
bbox=self.canvas.bbox(项目)
self.canvas.delete(“突出显示”)
如果是bbox:
i=self.canvas.create_矩形(
bbox,fill=“白色”,
tag=“突出显示”
)
self.canvas.lower(i,项)
def具有_焦点(自身):
return self.canvas.focus()
def具有_选择(自):
#破解Tkinter 1.101(Python 1.5.1)中的漏洞
返回self.canvas.tk.call(self.canvas._w'select','item')
def设置_焦点(自身、事件):
如果self.canvas.type(当前)!=“文本”:
返回
自高亮显示(当前)
#将焦点移到项目
self.canvas.focus_set()#将焦点移动到画布
self.canvas.focus(当前)#将焦点设置为文本项
self.canvas.select_from(当前,0)
self.canvas.select_to(当前,结束)
def set_光标(自身、事件):
#移动插入光标
item=self.has_focus()
如果不是项目:
返回#或做其他事情
#转换为画布坐标系
x=self.canvas.canvasx(event.x)
y=self.canvas.canvasy(event.y)
self.canvas.icursor(项目“@%d,%d”%(x,y))
canvas.select_clear()
def句柄_键(自身、事件):
#小部件范围的密钥调度程序
item=self.has_focus()
如果不是项目:
返回
insert=self.canvas.index(项,insert)
如果event.char>=“”:
#可打印字符
如果self.has_selection():
self.canvas.dchars(项目,先选择,后选择)
canvas.select_clear()
self.canvas.insert(项,“insert”,event.char)
自我强调(项目)
elif event.keysym==“退格”:
如果self.has_selection():
self.canvas.dchars(项目,先选择,后选择)
canvas.select_clear()
其他:
如果插入>0:
self.canvas.dchars(项目,插入-1,插入)
自我强调(项目)
#航行
elif event.keysym==“Home”:
self.canvas.icursor(项,0)
canvas.select_clear()
elif event.keysym==“End”:
self.canvas.icursor(项目,结束)
canvas.select_clear()
elif event.keysym==“Right”:
self.canvas.icursor(项目,插入+1)
canvas.select_clear()
elif event.keysym==“Left”:
self.canvas.icursor(项目,插入-1)
canvas.select_clear()
其他:
pass#print event.keysym
#试用(双击文本以启用编辑)
c=MyCanvas(Tk())
c、 包()
mainloop()
双击要编辑的项目之一后,我无法使光标离开;我尝试过移动焦点并将索引设置为-1,但这两种方法似乎都不起作用

self.canvas.focus("")
要从项中移除焦点,请使用空字符串调用此方法


您可以添加以下内容

self.canvas.focus_set() # move focus to canvas window
self.canvas.focus("") # remove focus from the current item that has it

因此,当用户双击不是由
canvas.create_text
创建的画布的任何部分或项目时,焦点将从当前“text”项目中移除,从而停止编辑


此外,你还可以添加

self.canvas.delete("highlight")

删除焦点时,删除文本周围的白色矩形。

请创建一个复制您遇到的问题的矩形。嘿!你有解决办法吗?我也面临同样的问题。
self.canvas.delete("highlight")