如何在Tkinter Python 3.7中为组合框退出菜单绑定按键事件

时间:2018-12-19 09:54:10

标签: python python-3.x tkinter combobox

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

因此,我尝试了类似以下操作: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()

1 个答案:

答案 0 :(得分:0)

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

from tkinter import ttk
import itertools as it

class mycombobox(ttk.Combobox):
    def __init__(self,**args):
        super().__init__(**args)
        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