我在使用Tkinter时遇到了一些问题,我只能假设这是一个bug。
from tkinter import *
def refocus(event, obj):
obj.focus()
root = Tk()
options = ["Hello", "world", "How", "are", "you"]
v1 = StringVar()
v2 = StringVar()
v3 = StringVar()
o1 = OptionMenu(root, v1, *options)
o1.configure(takefocus=1)
o2 = OptionMenu(root, v2, *options)
o2.configure(takefocus=1)
o3 = OptionMenu(root, v3, *options)
o3.configure(takefocus=1)
o1.bind("<Configure>", lambda e=Event(), o=o1: refocus(e, o))
o2.bind("<Configure>", lambda e=Event(), o=o2: refocus(e, o))
o3.bind("<Configure>", lambda e=Event(), o=o3: refocus(e, o))
o1.pack(side=TOP)
o2.pack(side=TOP)
o3.pack(side=TOP)
root.mainloop()
从代码中可以看出,我正在尝试使用键盘上的 tab、空格、箭头和 Enter 键来导航三个 OptionMenu 菜单。问题在于,一旦菜单框弹出,它似乎就失去了原始 OptionMenu 的焦点。为了解决这个问题,我绑定了configure,重新聚焦选项框,但这只适用于输入已更改的情况,因此我需要一种新的方法来解决这个问题。还有一个问题是,如果我选择了错误的选项,则必须循环遍历所有其他输入(OptionMenus、Entrys、Checkboxes等)才能回到那个选项以再次打开它。在只有一个 OptionMenu 的情况下,它将无法工作,直到我使用鼠标点击另一个输入。我正在寻找一种方法,在菜单部分失去焦点后,我可以重新聚焦在 OptionMenu 上。我还尝试使用 o1['menu'].bind(...),但这根本没有起作用。例程流程如下:o1 获得焦点 -> 按下空格 -> 打开菜单 -> 使用箭头移动 -> 按 Enter 选择 -> 聚焦于 o1 -> 按空格 -> 打开菜单 -> 使用箭头移动 -> 按 Enter 选择 -> 聚焦于 o1 -> 按 Tab -> o2 获得焦点。
ttk.Combobox
而不是OptionMenu
? - Bryan Oakleyo1.bind("<Configure>", lambda e=Event(), o=o1: refocus(e, o)
重构为o1.bind("<Configure>", refocus)
,并且def refocus(event):
event.widget.focus()
(值得思考)。 - JRiggles