【问题标题】:CTRL + a select all in entry widget tkinter pythonCTRL + 在条目小部件 tkinter python 中全选
【发布时间】:2017-01-05 04:42:50
【问题描述】:

如何在 Entry 小部件 tkinter python 中使用 click+drug 鼠标左键选择块等所有文本。

 e1 = tk.Entry(bop, width = 50, font = "Helvetica 13")
 e1.grid(row=1,column=1, padx=15, pady=15)
 e1.bind_class("Entry","<Control-a>", select_all(e1))

这里是select_all()的功能:

def select_all(e):
   a = e.select_range(0,tk.END)

【问题讨论】:

  • bind 需要函数名(回调) - 这意味着没有 () 和参数。您可以创建不带参数的函数,使用带参数的函数,或使用 lambda:bind( ..., lambda:select_all(e1))
  • 顺便说一句:Entry 有方法 get() 来获取所有文本。

标签: python user-interface tkinter ctrl tkinter-entry


【解决方案1】:

SO上有很多类似的例子

import tkinter as tk

def callback(event):
    print('e.get():', e.get())
    # or more universal
    print('event.widget.get():', event.widget.get())
    # select text after 50ms
    root.after(50, select_all, event.widget)

def select_all(widget):
    # select text
    widget.select_range(0, 'end')
    # move cursor to the end
    widget.icursor('end')

root = tk.Tk()

e = tk.Entry(root)
e.pack()
e.bind('<Control-a>', callback)

root.mainloop()

bind 需要不带 () 和参数(回调)的文件名。但bind 也总是使用一个参数event 执行此函数,它可以访问执行此函数event.widget 的条目,因此您可以将它与许多不同的条目一起使用。最后Entry.get() 获取所有文本。


编辑:

因为释放键后&lt;Control-a&gt; 选择被删除,所以我使用after() 在50ms 后执行选择。它选择所有文本(但它将光标移动到开头)并将光标移动到末尾。 (见上面的代码)


编辑:

在我找不到与Release 的正确组合之前,它必须是&lt;Control-KeyRelease-a&gt;,现在它不需要after()

import tkinter as tk

def callback(event):
    print('e.get():', e.get())
    # or more universal
    print('event.widget.get():', event.widget.get())

    # select text
    event.widget.select_range(0, 'end')
    # move cursor to the end
    event.widget.icursor('end')

root = tk.Tk()

e = tk.Entry(root)
e.pack()
e.bind('<Control-KeyRelease-a>', callback)

root.mainloop()

【讨论】:

  • 虽然您的示例很有用,但它并不能完全回答问题。您能否修改您的 callback 方法以实际执行“全选”功能?
  • 我找到了&lt;Control-KeyRelease-a&gt;,现在不需要after()
  • 奇怪,至少在带有 Python 2.7 的 Tkinter 中,我必须这样做 event.widget.icursor(0),这是开始,才能使选择起作用。
【解决方案2】:

furas 的回答很好,但仍然不能完美地模拟 Windows Ctrl+A 行为。该事件仅在释放“a”键后触发,但该事件应在“a”键按下时触发。

Python tkinter: stopping event propagation in text widgets tags 开始,我们需要停止事件传播。返回 '​​break' 会阻止任何后续事件破坏 ctrl+a 行为,并且还允许我们缩短绑定到 ''

def callback(event):

    # select text
    event.widget.select_range(0, 'end')
    # move cursor to the end
    event.widget.icursor('end')
    #stop propagation
    return 'break'

root = tk.Tk()

e = tk.Entry(root)
e.pack()
e.bind('<Control-a>', callback)

root.mainloop()

【讨论】:

  • 是否可以使用 lambda 进行一行?
  • 我设法做到了,而且似乎正在工作。我希望它不会引入一些讨厌的错误。 e.bind('&lt;Control-a&gt;', lambda x: e.selection_range(0, 'end') or "break")
猜你喜欢
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
  • 1970-01-01
  • 2018-01-01
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多