我正在研究我的第一个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()
答案 0 :(得分:14)
您需要进行选择,然后让函数返回字符串“break”来禁止默认操作。
这是由于Tkinter如何处理事件。它使用它所谓的“绑定标签”。即使它看起来像是绑定到窗口小部件,但实际上是绑定到作为窗口小部件名称的标记。还可以绑定到窗口小部件类,窗口小部件所在的顶层窗口以及标记“all”(如果愿意,还可以创建自己的标记)。
这些标记的默认顺序是从最具体到最不具体,并且事件按此顺序处理。意思是,如果您在窗口小部件(最具体)和类(不太具体)上都有绑定,则绑定将首先触发窗口小部件,然后针对类绑定(然后针对顶层,然后针对“all”) “)。
这意味着默认情况下,小部件上的绑定扩充而不是替换默认绑定。好消息是,你可以通过简单地返回字符串“break”来禁止任何进一步的绑定,这会阻止绑定链做更多的工作。
答案 1 :(得分: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()
是的,它完美无瑕。非常感谢Bryan Oakley。 Steven Rumbalski:这是一个非常好的观点,我也遵循了你的建议。
答案 2 :(得分:0)
您可以使用名为pyautogui
的模块来完成此操作
只需在要添加事件的位置运行命令,
import pyautogui
..., command=lambda *awargs:pyautogui.hotkey("ctrl","a")
确保安装模块。如果您使用的是Windows,请通过
进行安装pip install pyautogui