【问题标题】:Select all text in a Text widget using Python 3 with tkinter使用带有 tkinter 的 Python 3 选择 Text 小部件中的所有文本
【发布时间】:2012-11-27 21:39:09
【问题描述】:

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

【问题讨论】:

  • 一定要同时绑定大小写快捷键,否则大写锁定时它们将不起作用。

标签: python python-3.x tkinter


【解决方案1】:

您可以使用名为 pyautogui 的模块来做到这一点 只需运行要添加事件的命令,

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

确保安装该模块。如果您在 Windows 上,请通过

安装它
pip install pyautogui

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      所以新代码是……

      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:这是一个非常好的观点,我也听从了你的建议。

      【讨论】:

      • 当大写锁定打开时,按 Croll+A 不会选择所有文本。这是 MS Windows 中的默认设置。所以没有必要。
      猜你喜欢
      • 2015-07-06
      • 1970-01-01
      • 2011-05-22
      • 2017-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多