gpt4 book ai didi

python - tkinter 防止使用返回键删除选定的文本

转载 作者:太空宇宙 更新时间:2023-11-03 18:50:00 24 4
gpt4 key购买 nike

我正在实现一个基于 tkinter 文本小部件的控制台应用程序,作为自动完成功能的一部分,我观察到一个问题,即按回车键会导致所选文本被删除。下面的示例显示了类似的问题:

from Tkinter import *

def getCommand(*args):
global text
text.insert(END, "\n")
text.insert(END, "command>")
x = text.get("1.0",END)
print "command is %s" %(x)
return 'break'

def handle_keyrelease(event):
global text
if event.keysym == "Return":
text.tag_remove(SEL,"1.9",END)
text.mark_set("insert",END)
getCommand()
return 'break'

root = Tk()
text = Text(root)
text.pack()
text.insert(END,"command>")
text.focus()
text.bind("<KeyRelease>", handle_keyrelease)
text.insert(END,"sometext")
text.tag_add(SEL,"1.9",END)
text.mark_set("insert","1.9")
root.mainloop()

在这段代码中,当我按回车键时,我想获取完整的命令sometext,但是当前代码仅检索s。我尝试将光标位置设置为结束并在收到返回键事件时删除选择标签。

编辑

KeyPress 事件处理程序出现问题:

from Tkinter import *

def getCommand(*args):
global text
text.insert(END, "\n")
text.insert(END, "command>")
x = text.get("1.0",END)
print x
return 'break'

validkeysymchars = []
validkeysymchars = validkeysymchars + map(chr, range(65,91))
validkeysymchars = validkeysymchars + map(chr, range(97,123))

def handle_keyrelease(event):
global text
if event.keysym == "Return":
text.tag_remove(SEL,"1.9",END)
text.mark_set("insert",END)
getCommand()
return 'break'
if event.keysym in validkeysymchars:
for x in ['testcommand']:
strtocmp = text.get("MARK","end")
strtocmp = strtocmp.encode('ascii','ignore')
strtocmp = strtocmp.strip()
print strtocmp
if x.startswith(strtocmp):
currpos = text.index(INSERT)
text.insert(END,x[len(strtocmp):])
text.tag_add(SEL,currpos,"%s+%dc"%(currpos,len(x)-len(strtocmp)))
text.mark_set("insert",currpos)

root = Tk()
text = Text(root)
text.pack()
text.insert(END,"command>")
text.mark_set("MARK",INSERT)
text.mark_gravity("MARK",LEFT)
text.focus()
text.bind("<KeyPress>", handle_keyrelease)
root.mainloop()

最佳答案

问题是你处理 <KeyRelease>而不是<KeyPress> (或<Return>)。

当时<KeyRelease>事件被引发,文本小部件已经用换行符更新。由于选择了文本,因此所选文本只需替换为换行符(就像按任何其他键即可替换它一样)。

所以最好绑定(bind)到<KeyPress><Return>而不是<KeyRelease> .

<小时/>

我认为解决您的问题的最简单方法确实是处理 <KeyRelease><Return>分别。

(您可以使用 <KeyPress> 让它工作,但这将涉及检查按下了哪个键,手动将此键插入到文本中,检查选择了哪个文本,然后替换所选文本;因此,它将是相当笨重)。

def handle_keyrelease(event):
global text
if event.keysym in validkeysymchars:
for x in ['testcommand']:
strtocmp = text.get("MARK","end")
strtocmp = strtocmp.encode('ascii','ignore')
strtocmp = strtocmp.strip()
print strtocmp
if x.startswith(strtocmp):
currpos = text.index(INSERT)
text.insert(END,x[len(strtocmp):])
text.tag_add(SEL,currpos,"%s+%dc"%(currpos,len(x)-len(strtocmp)))
text.mark_set("insert",currpos)
return

def handle_return(event):
text.tag_remove(SEL,"1.9",END)
text.mark_set("insert",END)
text.insert(END, "\n")
text.insert(END, "command>")
text.mark_set("MARK",INSERT)
text.mark_gravity("MARK",LEFT)
return "break"

...
text.bind("<KeyRelease>", handle_keyrelease)
text.bind("<Return>", handle_return)
...

关于python - tkinter 防止使用返回键删除选定的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18568988/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com