Python 如何从Tkinter画布文本项中删除icursor?
下面是Effbot的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
# 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")