python - 组合框启用 ctrl+a 选择文本
问题描述
我想启用 ctrl+a 来选择组合框中的文本。而不是选择它所做的所有 <end> (至少或多或少)。
最小的例子:
#!/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>>
.
所以 platfrom 正确的事情是不要管它,学习使用 Control-slash 来选择所有。要覆盖这一点,您需要将 Control-a 绑定到生成 SelectAll 虚拟事件的函数,并防止默认事件处理程序将插入点移动到行首。为了那个原因:
def selall(ev):
ev.widget.event_generate('<<SelectAll>>')
return 'break'
month_cb.bind('<Control-a>', selall)
在这里return 'break'
很重要,否则事件处理程序将继续被调用,并且当<<LineStart>>
在我们的<<SelectAll>>
.
这可以在 IDLE 中进行调查,month_cb.bindtags()
以发现它的类绑定是 TCombobox。然后month_cb.bind_class('TCombobox')
查看绑定到这个类的所有事件。对于虚拟事件,root.event_info('<<SelectAll>>')
显示导致引发此虚拟事件的事件集。
推荐阅读
- javascript - 实例化和推送新对象后,数组中的每个对象都会被覆盖
- scenekit - 在 viewDidLoad 期间应用的 SceneKit 节点旋转无效
- getstream-io - Stream API 不发送“to”属性
- wordpress - WooCommerce - 添加到购物车时修改元键
- javascript - jQuery循环遍历数组和第一个两项的removeClass,同时为其余项提供不同的效果
- javascript - 在javascript中使用reduce或filter计算对象的数量
- javascript - 如何为 React Js 和 Node Js 使用相同的端口?
- go - 如何为通过 go 脚本运行的终端命令提供选项?
- xslt - XSL 下拉选择属性
- clojure - 如何使用 test.check 生成随机图?