使用带有tkinter的Python 3选择Text小部件中的所有文本

时间:2012-12-10 13:05:33

标签: python python-3.x tkinter

我正在研究我的第一个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()

3 个答案:

答案 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