15

我正在编写我的第一个 Python 程序,但对我在做什么一无所知。我想重新绑定 ctrl-a (control a) 以选择 Text 小部件中的所有文本。当前绑定是 ctrl-/(控制 /)。绑定部分直接跳转到函数,但实际的文本选择不起作用。相反,光标跳到第一行的第一个字符(就像它应该的那样),没有其他任何事情发生。我敢肯定这很容易解决,但是在花了一个小时一个小时之后,我不知道出了什么问题。

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()
4

3 回答 3

16

所以新代码是...

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()

是的,它完美无缺。非常感谢布莱恩·奥克利。Steven Rumbalski:这是一个非常好的观点,我也听从了你的建议。

于 2012-12-10T20:11:18.337 回答
15

您需要进行选择,然后通过让函数返回字符串“break”来禁止默认操作。

这是由于 Tkinter 如何处理事件。它使用所谓的“绑定标签”。尽管看起来您正在绑定到一个小部件,但实际上您正在绑定到一个作为小部件名称的标签。还可以绑定到小部件类、小部件所在的顶层窗口和标签“all”(另外,如果您愿意,您可以发明自己的标签)。

这些标签的默认顺序是从最具体到最不具体,并且按该顺序处理事件。意思是,如果您在小部件(最具体)和类(不太具体)上都有绑定,则绑定将首先为小部件触发,然后是类绑定(然后是顶层,然后是“所有”)。

这意味着默认情况下,小部件上的绑定会增加而不是替换默认绑定。好消息是,您可以通过简单地返回字符串“break”来阻止任何进一步的绑定触发,这会阻止绑定链做更多的工作。

于 2012-12-10T15:20:32.917 回答
1

您可以使用名为的模块执行此操作,pyautogui 只需运行要添加事件的命令,

import pyautogui
..., command=lambda *awargs:pyautogui.hotkey("ctrl","a")

确保安装模块。如果您在 Windows 上,请通过以下方式安装它

pip install pyautogui
于 2019-03-15T15:03:38.290 回答