python - 如何在 tkinter Python 3.7 中为组合框下拉菜单绑定(bind)按键事件

标签 python python-3.x tkinter combobox

我想做一个功能:当我在 tkinter 中单击组合框并打开下拉菜单时,当您按任意键(例如“s”)时,它会选择组合框中的第一个元素,以“s”字母开头。 但我不知道如何将它直接绑定(bind)到由组合框创建的列表框。如果我将 keyPress 事件绑定(bind)到组合框,则当下拉菜单打开时,它不会接收事件。

所以,我尝试了这样的东西:self.combobox.bind("<KeyPress>", self.keyPressed)但没有成功。

您能告诉我如何做到这一点吗?或者如果可能的话?

更新:微小的代码示例

import tkinter as tk
from tkinter import ttk

def pressed(evt):
    print ("key pressed")

f = tk.Frame();
f.grid()
c = ttk.Combobox(f,values = ["alfa","betta","gamma"])
c.grid(column = 0, row = 0)
c.bind("<KeyRelease>",pressed)
f.mainloop()

最佳答案

据我了解,目前Python中没有办法获取弹出菜单。而你必须通过 TCL 来做到这一点。弱点是引用的“.f.l”部分,因为它取决于内部小部件的实现。有一个组合框的示例,当您按下键盘按钮时,它将首先按字母选择项目。

from tkinter import ttk
import itertools as it

class mycombobox(ttk.Combobox):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        pd = self.tk.call('ttk::combobox::PopdownWindow', self) #get popdownWindow reference 
        lb = pd + '.f.l' #get popdown listbox
        self._bind(('bind', lb),"<KeyPress>",self.popup_key_pressed,None)

    def popup_key_pressed(self,evt):
        values = self.cget("values")
        for i in it.chain(range(self.current() + 1,len(values)),range(0,self.current())):
            if evt.char.lower() == values[i][0].lower():
                self.current(i)
                self.icursor(i)
                self.tk.eval(evt.widget + ' selection clear 0 end') #clear current selection
                self.tk.eval(evt.widget + ' selection set ' + str(i)) #select new element
                self.tk.eval(evt.widget + ' see ' + str(i)) #spin combobox popdown for selected element will be visible
                return

关于python - 如何在 tkinter Python 3.7 中为组合框下拉菜单绑定(bind)按键事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53848622/

相关文章:

python - 使用字典理解的元组元组到字典字典

python - 更新子类中的父字典

python - 在 Tkinter 中高效显示 OpenCV IplImage

python - MANIFEST.in 在 "python setup.py install"上被忽略 - 没有安装数据文件?

python-3.x - 多线程请求 Python3

python - 调整窗口大小时垂直增长小部件(使用网格几何管理器)

python - 使用函数指针作为 Python 的参数调用 Tcl 过程

python - 获取远程 zip 文件并列出其中的文件

python - 如何使用 python 更改 couchdb 数据库的权限

Python Django 多数据库提交具有外键关系的对象