Dav*_*ker 13 python tkinter python-3.x
我正在研究我的第一个Python程序,并且不知道我在做什么.我想重新绑定ctrl-a(控件a)以选择Text小部件中的所有文本.当前绑定是ctrl- /(control /).绑定部分向右跳转到函数,但实际的文本选择不起作用.相反,光标跳转到第一行的第一个字符(就像它应该),没有其他任何事情发生.我确信这很容易修复但是花了一个小时就可以了,我无法弄清楚出了什么问题.
Python 3,Windows:
from tkinter import *
# Select all the text in textbox (not working)
def select_all(event):
textbox.tag_add(SEL, "1.0", END)
textbox.mark_set(INSERT, "1.0")
textbox.see(INSERT)
# Open a window
mainwin = Tk()
# Create a text widget
textbox = Text(mainwin, width=40, height=10)
textbox.pack()
# Add some text
textbox.insert(INSERT, "Select some text then right click in this window")
# Add the binding
textbox.bind("<Control-Key-a>", select_all)
# Start the program
mainwin.mainloop()
Run Code Online (Sandbox Code Playgroud)
Bry*_*ley 14
您需要进行选择,然后通过让函数返回字符串"break"来禁止默认操作.
这是由于Tkinter如何处理事件.它使用它所谓的"绑定标签".即使它看起来像是绑定到窗口小部件,但实际上是绑定到作为窗口小部件名称的标记.还可以绑定到窗口小部件类,窗口小部件所在的顶层窗口以及标记"all"(如果您愿意,还可以创建自己的标记).
这些标记的默认顺序是从最具体到最不具体的,并且事件按该顺序处理.意思是,如果您在窗口小部件(最具体)和类(不太具体)上都绑定,则绑定将首先触发窗口小部件,然后针对类绑定(然后针对顶层,然后针对"all") ").
这意味着默认情况下,窗口小部件上的绑定会增加而不是替换默认绑定.好消息是,你可以通过简单地返回字符串"break"来禁止任何进一步的绑定,这会阻止绑定链做更多的工作.
Dav*_*ker 12
所以新代码是......
from tkinter import *
# Select all the text in textbox
def select_all(event):
textbox.tag_add(SEL, "1.0", END)
textbox.mark_set(INSERT, "1.0")
textbox.see(INSERT)
return 'break'
# Open a window
mainwin = Tk()
# Create a text widget
textbox = Text(mainwin, width=40, height=10)
textbox.pack()
# Add some text
textbox.insert(INSERT, "Select some text then right click in this window")
# Add the binding
textbox.bind("<Control-Key-a>", select_all)
textbox.bind("<Control-Key-A>", select_all) # just in case caps lock is on
# Start the program
mainwin.mainloop()
Run Code Online (Sandbox Code Playgroud)
是的,它完美无瑕.非常感谢Bryan Oakley.Steven Rumbalski:这是一个非常好的观点,我也遵循了你的建议.
| 归档时间: |
|
| 查看次数: |
8169 次 |
| 最近记录: |