我要创建一个功能:单击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()
答案 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