组合框启用 ctrl+a 到 select 文本
Combobox enable ctrl+a to select text
我想启用 ctrl+a select 组合框中的文本。而不是 select 它所做的一切 (至少或多或少)。
最小示例:
#!/usr/bin/env python3
import tkinter as tk
from tkinter import ttk
from tkinter.messagebox import showinfo
root = tk.Tk()
def month_changed(event):
msg = f'You selected {month_cb.get()}!'
showinfo(title='Result', message=msg)
# month of year
months = ['Jan', 'Feb']
# create a combobox
selected_month = tk.StringVar()
month_cb = ttk.Combobox(root, textvariable=selected_month)
month_cb['values'] = months
month_cb.pack(fill='x', padx=5, pady=5)
month_cb.bind('<<ComboboxSelected>>', month_changed)
month_cb.bind('<Control-a>', doSomeSelecting) #doSomeSelcting tbd
root.mainloop()
我从这里窃取了示例并将其最小化以获得快速示例:https://www.pythontutorial.net/tkinter/tkinter-combobox/
所以您正在做的是覆盖您平台的默认绑定。在 X11 上,Tk 为 Control-Key-slash
设置默认绑定以生成 <<SelectAll>>
虚拟事件。在 Win32 上,这也用 Control-Key-a
扩展。在 X11 上,Control-a 绑定到 <<LineStart>>
.
所以平台正确的做法是不要管它,学会使用 Control-slash 来 select 全部。要覆盖它,您需要将 Control-a 绑定到生成 SelectAll 虚拟事件的函数 并且 防止默认事件处理程序将插入点移动到行的开头。为此:
def selall(ev):
ev.widget.event_generate('<<SelectAll>>')
return 'break'
month_cb.bind('<Control-a>', selall)
return 'break'
在这里很重要,否则事件处理程序将继续被调用,并且当某些东西在我们的 <<SelectAll>>
之后生成 <<LineStart>>
事件时,我们的 selection 将被撤消.
这可以在 IDLE 中使用 month_cb.bindtags()
进行调查,发现它的 class 绑定是 TCombobox。然后 month_cb.bind_class('TCombobox')
查看绑定到此 class 的所有事件。对于虚拟事件,root.event_info('<<SelectAll>>')
显示导致引发此虚拟事件的事件集。
我想启用 ctrl+a select 组合框中的文本。而不是 select 它所做的一切
最小示例:
#!/usr/bin/env python3
import tkinter as tk
from tkinter import ttk
from tkinter.messagebox import showinfo
root = tk.Tk()
def month_changed(event):
msg = f'You selected {month_cb.get()}!'
showinfo(title='Result', message=msg)
# month of year
months = ['Jan', 'Feb']
# create a combobox
selected_month = tk.StringVar()
month_cb = ttk.Combobox(root, textvariable=selected_month)
month_cb['values'] = months
month_cb.pack(fill='x', padx=5, pady=5)
month_cb.bind('<<ComboboxSelected>>', month_changed)
month_cb.bind('<Control-a>', doSomeSelecting) #doSomeSelcting tbd
root.mainloop()
我从这里窃取了示例并将其最小化以获得快速示例:https://www.pythontutorial.net/tkinter/tkinter-combobox/
所以您正在做的是覆盖您平台的默认绑定。在 X11 上,Tk 为 Control-Key-slash
设置默认绑定以生成 <<SelectAll>>
虚拟事件。在 Win32 上,这也用 Control-Key-a
扩展。在 X11 上,Control-a 绑定到 <<LineStart>>
.
所以平台正确的做法是不要管它,学会使用 Control-slash 来 select 全部。要覆盖它,您需要将 Control-a 绑定到生成 SelectAll 虚拟事件的函数 并且 防止默认事件处理程序将插入点移动到行的开头。为此:
def selall(ev):
ev.widget.event_generate('<<SelectAll>>')
return 'break'
month_cb.bind('<Control-a>', selall)
return 'break'
在这里很重要,否则事件处理程序将继续被调用,并且当某些东西在我们的 <<SelectAll>>
之后生成 <<LineStart>>
事件时,我们的 selection 将被撤消.
这可以在 IDLE 中使用 month_cb.bindtags()
进行调查,发现它的 class 绑定是 TCombobox。然后 month_cb.bind_class('TCombobox')
查看绑定到此 class 的所有事件。对于虚拟事件,root.event_info('<<SelectAll>>')
显示导致引发此虚拟事件的事件集。