首页 > 解决方案 > 组合框启用 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/

标签: pythontkintercombobox

解决方案


所以你正在做的是覆盖你的平台的默认绑定。在 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>>')显示导致引发此虚拟事件的事件集。


推荐阅读